SRFI 214: Flexvectors
Arthur A. Gleckler
(07 Oct 2020 17:10 UTC)
|
Re: SRFI 214: Flexvectors
Marc Nieper-Wißkirchen
(08 Oct 2020 09:41 UTC)
|
Re: SRFI 214: Flexvectors
Marc Nieper-Wißkirchen
(08 Oct 2020 09:59 UTC)
|
Re: SRFI 214: Flexvectors
Adam Nelson
(08 Oct 2020 12:10 UTC)
|
Nomenclature
Lassi Kortela
(08 Oct 2020 12:19 UTC)
|
Re: SRFI 214: Flexvectors
Marc Nieper-Wißkirchen
(08 Oct 2020 12:19 UTC)
|
Nomenclature
Lassi Kortela
(08 Oct 2020 12:26 UTC)
|
Re: Nomenclature
Marc Nieper-Wißkirchen
(08 Oct 2020 12:31 UTC)
|
Re: Nomenclature
Lassi Kortela
(08 Oct 2020 12:50 UTC)
|
Re: Nomenclature
Marc Nieper-Wißkirchen
(08 Oct 2020 13:01 UTC)
|
Flexvectors vs subtyping
Per Bothner
(08 Oct 2020 17:23 UTC)
|
Re: Flexvectors vs subtyping
Arthur A. Gleckler
(08 Oct 2020 17:29 UTC)
|
Re: Flexvectors vs subtyping
Adam Nelson
(08 Oct 2020 17:32 UTC)
|
Re: Flexvectors vs subtyping
Marc Nieper-Wißkirchen
(08 Oct 2020 17:46 UTC)
|
Re: Flexvectors vs subtyping
Adam Nelson
(08 Oct 2020 17:56 UTC)
|
Re: Flexvectors vs subtyping
Marc Nieper-Wißkirchen
(08 Oct 2020 19:21 UTC)
|
Re: Flexvectors vs subtyping
Lassi Kortela
(08 Oct 2020 20:09 UTC)
|
Re: Flexvectors vs subtyping
Marc Nieper-Wißkirchen
(08 Oct 2020 20:51 UTC)
|
Re: Flexvectors vs subtyping
Lassi Kortela
(08 Oct 2020 21:23 UTC)
|
Re: Flexvectors vs subtyping
Arvydas Silanskas
(12 Oct 2020 09:58 UTC)
|
Re: Flexvectors vs subtyping Marc Nieper-Wißkirchen (08 Oct 2020 20:35 UTC)
|
Re: Flexvectors vs subtyping
Per Bothner
(08 Oct 2020 17:54 UTC)
|
Re: Flexvectors vs subtyping
Lassi Kortela
(08 Oct 2020 20:39 UTC)
|
Re: SRFI 214: Flexvectors
Marc Nieper-Wißkirchen
(08 Oct 2020 17:32 UTC)
|
Re: SRFI 214: Flexvectors
Adam Nelson
(08 Oct 2020 17:35 UTC)
|
Re: SRFI 214: Flexvectors
Marc Nieper-Wißkirchen
(08 Oct 2020 18:05 UTC)
|
Re: SRFI 214: Flexvectors
Adam Nelson
(08 Oct 2020 18:34 UTC)
|
Re: SRFI 214: Flexvectors
Marc Nieper-Wißkirchen
(08 Oct 2020 18:57 UTC)
|
Flexvector computational complexity
Adam Nelson
(08 Oct 2020 17:47 UTC)
|
Re: Flexvector computational complexity
Marc Nieper-Wißkirchen
(08 Oct 2020 19:04 UTC)
|
Re: Flexvector computational complexity
John Cowan
(08 Oct 2020 19:18 UTC)
|
Re: Flexvector computational complexity
Adam Nelson
(08 Oct 2020 19:40 UTC)
|
Am Do., 8. Okt. 2020 um 21:20 Uhr schrieb Marc Nieper-Wißkirchen <xxxxxx@nieper-wisskirchen.de>: > For example, one objection against the many exported identifiers of > the form TYPE-OPERATION (like vector-unfold or generator-map) is the > duplication of similar identifiers. It would be enough to have general > "procedures" unfold, map, etc., which takes as their first argument an > expand-time value that selects the type (at expand-time). E.g. > > (map :vector PROC ARG) > > or > > (unfold :generator STOP? ...) > > One would implement (given that R7RS (large) becomes at least as > expressive as R6RS) map, unfold, etc. as a macro, which checks whether > the first argument carries a certain SRFI 213 property indicating that > it specifies a type. If this is the case, the correct procedure is > selected at expand-time. Otherwise, the first argument is evaluated. > If it is runtime-type specifier the correct procedure is selected at > runtime. Otherwise, we fall back to the usual behavior of, say, map or > unfold. > > Finally, we need identifier syntax so that when the keywords map or > unfold do not appear at head position, they evaluate to a proper > procedure. Here is some demonstration code: ;;; test-generics.scm (import (except (scheme base) map) (scheme write) (generics)) (define (f x) (* x x)) (display (map f '(1 2 3))) (newline) (display (map :vector f #(1 2 3))) (newline) (display (let ((m map)) (m f '(1 2 3)))) (newline) (display (let ((m map)) (m :vector f #(1 2 3)))) (newline) ;;; generics.sls (library (generics) (export map :list :vector) (import (rename (scheme base) (map list-map)) (scheme write) (srfi :211 syntax-case) (%generics)) (define-syntax map (lambda (stx) (lambda (lookup) (syntax-case stx () ((_ type arg* ...) (identifier? #'type) (cond ((lookup #'type #'type-key) => (lambda (name) (case name ((list) #'(list-map arg* ...)) ((vector) #'(vector-map arg* ...)) (else (syntax-violation 'map "unsupported type" stx #'type))))) (else #'(list-map type arg* ...)))) ((_ arg* ...) #'(list-map arg* ...)) (_ #'%map)))))) ;;; %generics.sls [Intenal library] (library (%generics) (export %map type? type-name :list :vector type-key) (import (scheme base) (srfi :211 syntax-case) (srfi :213)) (define-record-type <type> (make-type name) type? (name type-name)) (define :list (make-type 'list)) (define :vector (make-type 'vector)) (define-syntax type-key (lambda (stx) (syntax-violation #f "invalid use of syntax" stx))) (define-property :list type-key 'list) (define-property :vector type-key 'vector) (define (%map type . args) (if (type? type) (case (type-name type) ((list) (apply map args)) ((vector) (apply vector-map args)) (else => (lambda (name) (error "map: unsupported type" name)))) (apply map type args))))