* reserved-keyword in macro @ 2022-02-02 10:13 Damien Mattei 2022-02-02 10:33 ` Maxime Devos 0 siblings, 1 reply; 10+ messages in thread From: Damien Mattei @ 2022-02-02 10:13 UTC (permalink / raw) To: guile-user hello, what is the best way to use a reserved keyword in a macro (a keyword for me not already used in scheme): if i have multiple patterns in a macro,for example: (define-syntax macro (syntax-rules () ((_ arg1 arg2) code1) ((_ reserved-keyword arg) code2))) now if i call the macro with (macro reserved-keyword 777) code1 is expansed but not code2 i can merge code1 and code2 and do some inner test to check reserved-keyword like this: (if (equal? (quote arg1) (quote reserved-keyword)) ;; test which had worked in past but is there a better way like : (define-syntax macro (syntax-rules (reserved-keyword) but i can not fix it to work. regards, damien ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: reserved-keyword in macro 2022-02-02 10:13 reserved-keyword in macro Damien Mattei @ 2022-02-02 10:33 ` Maxime Devos [not found] ` <CADEOaddzjFbSYvVGEOkrSrjHSZvUkqC9beiRw29jbH3XHeRkZw@mail.gmail.com> 0 siblings, 1 reply; 10+ messages in thread From: Maxime Devos @ 2022-02-02 10:33 UTC (permalink / raw) To: Damien Mattei, guile-user [-- Attachment #1: Type: text/plain, Size: 427 bytes --] Damien Mattei schreef op wo 02-02-2022 om 11:13 [+0100]: > (define-syntax macro > (syntax-rules () > ((_ arg1 arg2) code1) > ((_ reserved-keyword arg) code2))) The rules are matched in-order, so when the first rule matches, the second rule is ignored. I suggest: (define-syntax macro (syntax-rules (reserved-keyword) ((_ reserved-keyword arg) code2) ((_ arg1 arg2) code1))) Greetings, Maxime [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 260 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
[parent not found: <CADEOaddzjFbSYvVGEOkrSrjHSZvUkqC9beiRw29jbH3XHeRkZw@mail.gmail.com>]
* Fwd: reserved-keyword in macro [not found] ` <CADEOaddzjFbSYvVGEOkrSrjHSZvUkqC9beiRw29jbH3XHeRkZw@mail.gmail.com> @ 2022-02-02 13:02 ` Damien Mattei 2022-02-02 21:23 ` Damien Mattei 0 siblings, 1 reply; 10+ messages in thread From: Damien Mattei @ 2022-02-02 13:02 UTC (permalink / raw) To: guile-user sorry i miss copy to mailing list... ---------- Forwarded message --------- From: Damien Mattei <damien.mattei@gmail.com> Date: Wed, Feb 2, 2022 at 12:09 PM Subject: Re: reserved-keyword in macro To: Maxime Devos <maximedevos@telenet.be> thanks maxim ,it works so my problem come from elsewhere scheme@(guile-user)> (define-syntax macro (syntax-rules (reserved-keyword) ((_ reserved-keyword arg) 'first) ... ((_ arg1 arg2) 'second))) scheme@(guile-user)> (macro 4 5) second scheme@(guile-user)> (macro reserved-keyword 5) first this was a simplified example my real case is this: (define-syntax <- (syntax-rules ($bracket-apply$) ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T 4)) ;; one dimension array, example: {a[4] <- 7} ;; $bracket-apply$ of SRFI 105 ((_ ($bracket-apply$ container index) expr) (let ((value expr)) ;; to avoid compute it twice ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test funct-or-macro equal $bracket-apply$ ;; normal case ;; {T[2] <- 4} ;; {T[3] <- T[2]} ;;(begin ;;(display "<- : vector or array set! or hash-table set!") (newline) (cond ((vector? container) (vector-set! container index value)) ((hash-table? container) (hash-table-set! container index value)) (else (array-set! container index value)));) ;; rare case (to prevent any error) ;; (let ((var (funct-or-macro container index))) ;; MUST be in a variable , otherwise: ;; While compiling expression: ;; Syntax error: ;; unknown location: quote: bad syntax in form quote ;; <- : variable set! after creation ;; (set! var value))) value)) ;; multi dimensions array : {a[2 4] <- 7} ;; $bracket-apply$ of SRFI 105 ((_ ($bracket-apply$ array index1 index2 ...) expr) (let ((value expr)) ;; to avoid compute it twice ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test funct-or-macro equal $bracket-apply$ ;; normal case ;;(begin ;;(display "<- : multidimensional vector or array set!") (newline) (if (vector? array) (array-n-dim-set! array value index1 index2 ...) (array-set! array index1 index2 ... value));) ;; rare case (to prevent any error) ;; (let ((var (funct-or-macro array index ...))) ;; MUST be in a variable ;; (display "<- : variable set! after creation (multidimensional)") (newline) ;; (set! var value))) value)) ;; not sure this case will be usefull ;; (define (foo) (values 1 2 3)) ;; (call-with-values foo list) ;;'(1 2 3) ;; (define (foo) (display "inside foo") (newline) (values 1 2 3)) ;; > (declare x y z) ;; > (<- (x y z) (foo)) ;; ((_ (funct-or-macro arg ...) expr) ;; (let ((var (funct-or-macro arg ...)) ;; (value expr)) ;; to avoid compute it twice ;; (set! var value) ;; var)) ((_ (var ...) expr) (begin (display expr) (newline) (let ((expr-list (call-with-values (lambda () expr) list))) (assign-var (var ...) expr-list) expr-list))) ;;(<- x 5) ((_ var expr) (begin ;;(display "<- : variable set!") (newline) (set! var expr) var)) ;; (declare x y z t) ;; {x <- y <- z <- t <- 7} ;; 7 ;; (list x y z t) ;; (7 7 7 7) ;; (declare I) ;; {I <- (make-array 0 4 4)} ;; #2((0 0 0 0) ;; (0 0 0 0) ;; (0 0 0 0) ;; (0 0 0 0)) ;; ;; {I[0 0] <- I[1 1] <- I[2 2] <- I[3 3] <- 1} ;; 1 ;; ;; I ;; #2((1 0 0 0) ;; (0 1 0 0) ;; (0 0 1 0) ;; (0 0 0 1)) ((_ var var1 var2 ...) ;; there is an expression in the last part of ellipsis! (<- var (<- var1 var2 ...))) )) ;; > (declare x y z) ;; > (assign-var (x y z) (1 2 3)) ;; > x ;; 1 ;; > y ;; 2 ;; > z ;; 3 (define-syntax assign-var (syntax-rules () ((_ (var ...) (exp ...)) (begin (set! var exp) ...)))) i'm cross developping in Guile and Racket and i'm sure Guile will do as Racket and here is the result: Bienvenue dans DrRacket, version 7.7 [3m]. Langage: reader "../SRFI/SRFI-105.rkt", avec débogage; limite mémoire : 128 MB. > (declare x y z) > (define (foo) (display "inside foo") (newline) (values 1 2 3)) > (<- (x y z) (foo)) inside foo . . ../../../../../../../../usr/share/racket/collects/racket/private/kw.rkt:1201:25: result arity mismatch; expected number of values not received expected: 1 received: 3 values...: > (define T (make-vector 5)) > {T[2] <- 1} 1 . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: (assign-var ($bracket-apply$ T 2) expr-list) > (<- T[2] 1) . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: (assign-var (2) expr-list) > (<- ($bracket-apply$ T 2) 1) 1 . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: (assign-var ($bracket-apply$ T 2) expr-list) > the problem is that anyway i do it when using reserved keyword in define-syntax the macro use the third case: (_ (var ...) expr) even when i have : (syntax-rules ($bracket-apply$) ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T 4)) ;; one dimension array, example: {a[4] <- 7} ;; $bracket-apply$ of SRFI 105 ((_ ($bracket-apply$ container index) expr) with (<- ($bracket-apply$ T 2) 1) entered at toplevel i should not be in the third case but the first of the macro <- that is strange... i think i could not get help from mailing list on a so complex example that rely on my Scheme+ development for multiple values return (aka let-values replacment with <- ), sorry for the inconvenience Damien On Wed, Feb 2, 2022 at 11:33 AM Maxime Devos <maximedevos@telenet.be> wrote: > Damien Mattei schreef op wo 02-02-2022 om 11:13 [+0100]: > > (define-syntax macro > > (syntax-rules () > > ((_ arg1 arg2) code1) > > ((_ reserved-keyword arg) code2))) > > The rules are matched in-order, so when the first rule matches, the > second rule is ignored. I suggest: > > (define-syntax macro > (syntax-rules (reserved-keyword) > ((_ reserved-keyword arg) code2) > ((_ arg1 arg2) code1))) > > Greetings, > Maxime > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: reserved-keyword in macro 2022-02-02 13:02 ` Fwd: " Damien Mattei @ 2022-02-02 21:23 ` Damien Mattei 2022-02-02 21:38 ` Damien Mattei 0 siblings, 1 reply; 10+ messages in thread From: Damien Mattei @ 2022-02-02 21:23 UTC (permalink / raw) To: guile-user really,nothing have an idea? seems $bracket-apply$ is bind to the variable var of the third case in the macro instead of ignored in the first case... but why? (it the same thing if i change the patterns order) On Wed, Feb 2, 2022 at 2:02 PM Damien Mattei <damien.mattei@gmail.com> wrote: > sorry i miss copy to mailing list... > > ---------- Forwarded message --------- > From: Damien Mattei <damien.mattei@gmail.com> > Date: Wed, Feb 2, 2022 at 12:09 PM > Subject: Re: reserved-keyword in macro > To: Maxime Devos <maximedevos@telenet.be> > > > thanks maxim ,it works so my problem come from elsewhere > > scheme@(guile-user)> (define-syntax macro > (syntax-rules (reserved-keyword) > ((_ reserved-keyword arg) 'first) > ... ((_ arg1 arg2) 'second))) > scheme@(guile-user)> (macro 4 5) > second > scheme@(guile-user)> (macro reserved-keyword 5) > first > > this was a simplified example my real case is this: > (define-syntax <- > > (syntax-rules ($bracket-apply$) > > ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T > 4)) > > ;; one dimension array, example: {a[4] <- 7} > ;; $bracket-apply$ of SRFI 105 > ((_ ($bracket-apply$ container index) expr) > (let ((value expr)) ;; to avoid compute it twice > > ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; > test funct-or-macro equal $bracket-apply$ > > ;; normal case > ;; {T[2] <- 4} > ;; {T[3] <- T[2]} > ;;(begin > ;;(display "<- : vector or array set! or hash-table set!") (newline) > (cond ((vector? container) (vector-set! container index value)) > ((hash-table? container) (hash-table-set! container index value)) > (else (array-set! container index value)));) > > ;; rare case (to prevent any error) > ;; (let ((var (funct-or-macro container index))) ;; MUST be in a > variable , otherwise: > ;; While compiling expression: > ;; Syntax error: > ;; unknown location: quote: bad syntax in form quote > ;; <- : variable set! after creation > ;; (set! var value))) > > value)) > > > ;; multi dimensions array : {a[2 4] <- 7} > ;; $bracket-apply$ of SRFI 105 > ((_ ($bracket-apply$ array index1 index2 ...) expr) > (let ((value expr)) ;; to avoid compute it twice > > ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; > test funct-or-macro equal $bracket-apply$ > ;; normal case > ;;(begin > ;;(display "<- : multidimensional vector or array set!") (newline) > (if (vector? array) > (array-n-dim-set! array value index1 index2 ...) > (array-set! array index1 index2 ... value));) > > ;; rare case (to prevent any error) > ;; (let ((var (funct-or-macro array index ...))) ;; MUST be in a variable > ;; (display "<- : variable set! after creation (multidimensional)") > (newline) > ;; (set! var value))) > value)) > > ;; not sure this case will be usefull > ;; (define (foo) (values 1 2 3)) > ;; (call-with-values foo list) > ;;'(1 2 3) > ;; (define (foo) (display "inside foo") (newline) (values 1 2 3)) > ;; > (declare x y z) > ;; > (<- (x y z) (foo)) > ;; ((_ (funct-or-macro arg ...) expr) > ;; (let ((var (funct-or-macro arg ...)) > ;; (value expr)) ;; to avoid compute it twice > ;; (set! var value) > ;; var)) > > ((_ (var ...) expr) > (begin > (display expr) (newline) > (let ((expr-list (call-with-values (lambda () expr) list))) > > (assign-var (var ...) expr-list) > expr-list))) > > > ;;(<- x 5) > ((_ var expr) > > (begin > ;;(display "<- : variable set!") (newline) > (set! var expr) > var)) > > > ;; (declare x y z t) > ;; {x <- y <- z <- t <- 7} > ;; 7 > ;; (list x y z t) > ;; (7 7 7 7) > > ;; (declare I) > ;; {I <- (make-array 0 4 4)} > ;; #2((0 0 0 0) > ;; (0 0 0 0) > ;; (0 0 0 0) > ;; (0 0 0 0)) > ;; > ;; {I[0 0] <- I[1 1] <- I[2 2] <- I[3 3] <- 1} > ;; 1 > ;; > ;; I > ;; #2((1 0 0 0) > ;; (0 1 0 0) > ;; (0 0 1 0) > ;; (0 0 0 1)) > > ((_ var var1 var2 ...) ;; there is an expression in the last part of > ellipsis! > (<- var (<- var1 var2 ...))) > > )) > > > ;; > (declare x y z) > ;; > (assign-var (x y z) (1 2 3)) > ;; > x > ;; 1 > ;; > y > ;; 2 > ;; > z > ;; 3 > (define-syntax assign-var > (syntax-rules () > > ((_ (var ...) (exp ...)) (begin (set! var exp) ...)))) > > i'm cross developping in Guile and Racket and i'm sure Guile will do as > Racket and here is the result: > > Bienvenue dans DrRacket, version 7.7 [3m]. > Langage: reader "../SRFI/SRFI-105.rkt", avec débogage; limite mémoire : > 128 MB. > > (declare x y z) > > (define (foo) (display "inside foo") (newline) (values 1 2 3)) > > (<- (x y z) (foo)) > inside foo > . . > ../../../../../../../../usr/share/racket/collects/racket/private/kw.rkt:1201:25: > result arity mismatch; > expected number of values not received > expected: 1 > received: 3 > values...: > > (define T (make-vector 5)) > > {T[2] <- 1} > 1 > . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: > (assign-var ($bracket-apply$ T 2) expr-list) > > (<- T[2] 1) > . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: > (assign-var (2) expr-list) > > (<- ($bracket-apply$ T 2) 1) > 1 > . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: > (assign-var ($bracket-apply$ T 2) expr-list) > > > > the problem is that anyway i do it when using reserved keyword in > define-syntax the macro use the third case: > (_ (var ...) expr) > even when i have : > > (syntax-rules ($bracket-apply$) > > ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T > 4)) > > ;; one dimension array, example: {a[4] <- 7} > ;; $bracket-apply$ of SRFI 105 > ((_ ($bracket-apply$ container index) expr) > > > with (<- ($bracket-apply$ T 2) 1) entered at toplevel i should not be in > the third case but the first of the macro <- > > that is strange... i think i could not get help from mailing list on a so > complex example that rely on my Scheme+ development for multiple values > return (aka let-values replacment with <- ), > sorry for the inconvenience > Damien > > > On Wed, Feb 2, 2022 at 11:33 AM Maxime Devos <maximedevos@telenet.be> > wrote: > >> Damien Mattei schreef op wo 02-02-2022 om 11:13 [+0100]: >> > (define-syntax macro >> > (syntax-rules () >> > ((_ arg1 arg2) code1) >> > ((_ reserved-keyword arg) code2))) >> >> The rules are matched in-order, so when the first rule matches, the >> second rule is ignored. I suggest: >> >> (define-syntax macro >> (syntax-rules (reserved-keyword) >> ((_ reserved-keyword arg) code2) >> ((_ arg1 arg2) code1))) >> >> Greetings, >> Maxime >> >> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: reserved-keyword in macro 2022-02-02 21:23 ` Damien Mattei @ 2022-02-02 21:38 ` Damien Mattei 2022-02-03 0:52 ` Vijay Marupudi 0 siblings, 1 reply; 10+ messages in thread From: Damien Mattei @ 2022-02-02 21:38 UTC (permalink / raw) To: guile-user i suppose it has something to see with this: "A literal matches an input expression if the input expression is an identifier with the same name as the literal, and both are unbound13 <https://www.gnu.org/software/guile/manual/html_node/Syntax-Rules.html#FOOT13>. " as $bracket-apply$ is already bind to a definition the pattern will not be matched: https://www.gnu.org/software/guile/manual/html_node/Syntax-Rules.html On Wed, Feb 2, 2022 at 10:23 PM Damien Mattei <damien.mattei@gmail.com> wrote: > really,nothing have an idea? seems $bracket-apply$ is bind to the variable > var of the third case in the macro instead of ignored in the first case... > but why? (it the same thing if i change the patterns order) > > On Wed, Feb 2, 2022 at 2:02 PM Damien Mattei <damien.mattei@gmail.com> > wrote: > >> sorry i miss copy to mailing list... >> >> ---------- Forwarded message --------- >> From: Damien Mattei <damien.mattei@gmail.com> >> Date: Wed, Feb 2, 2022 at 12:09 PM >> Subject: Re: reserved-keyword in macro >> To: Maxime Devos <maximedevos@telenet.be> >> >> >> thanks maxim ,it works so my problem come from elsewhere >> >> scheme@(guile-user)> (define-syntax macro >> (syntax-rules (reserved-keyword) >> ((_ reserved-keyword arg) 'first) >> ... ((_ arg1 arg2) 'second))) >> scheme@(guile-user)> (macro 4 5) >> second >> scheme@(guile-user)> (macro reserved-keyword 5) >> first >> >> this was a simplified example my real case is this: >> (define-syntax <- >> >> (syntax-rules ($bracket-apply$) >> >> ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T >> 4)) >> >> ;; one dimension array, example: {a[4] <- 7} >> ;; $bracket-apply$ of SRFI 105 >> ((_ ($bracket-apply$ container index) expr) >> (let ((value expr)) ;; to avoid compute it twice >> >> ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; >> test funct-or-macro equal $bracket-apply$ >> >> ;; normal case >> ;; {T[2] <- 4} >> ;; {T[3] <- T[2]} >> ;;(begin >> ;;(display "<- : vector or array set! or hash-table set!") >> (newline) >> (cond ((vector? container) (vector-set! container index value)) >> ((hash-table? container) (hash-table-set! container index value)) >> (else (array-set! container index value)));) >> >> ;; rare case (to prevent any error) >> ;; (let ((var (funct-or-macro container index))) ;; MUST be in a >> variable , otherwise: >> ;; While compiling expression: >> ;; Syntax error: >> ;; unknown location: quote: bad syntax in form quote >> ;; <- : variable set! after creation >> ;; (set! var value))) >> >> value)) >> >> >> ;; multi dimensions array : {a[2 4] <- 7} >> ;; $bracket-apply$ of SRFI 105 >> ((_ ($bracket-apply$ array index1 index2 ...) expr) >> (let ((value expr)) ;; to avoid compute it twice >> >> ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; >> test funct-or-macro equal $bracket-apply$ >> ;; normal case >> ;;(begin >> ;;(display "<- : multidimensional vector or array set!") (newline) >> (if (vector? array) >> (array-n-dim-set! array value index1 index2 ...) >> (array-set! array index1 index2 ... value));) >> >> ;; rare case (to prevent any error) >> ;; (let ((var (funct-or-macro array index ...))) ;; MUST be in a variable >> ;; (display "<- : variable set! after creation (multidimensional)") >> (newline) >> ;; (set! var value))) >> value)) >> >> ;; not sure this case will be usefull >> ;; (define (foo) (values 1 2 3)) >> ;; (call-with-values foo list) >> ;;'(1 2 3) >> ;; (define (foo) (display "inside foo") (newline) (values 1 2 3)) >> ;; > (declare x y z) >> ;; > (<- (x y z) (foo)) >> ;; ((_ (funct-or-macro arg ...) expr) >> ;; (let ((var (funct-or-macro arg ...)) >> ;; (value expr)) ;; to avoid compute it twice >> ;; (set! var value) >> ;; var)) >> >> ((_ (var ...) expr) >> (begin >> (display expr) (newline) >> (let ((expr-list (call-with-values (lambda () expr) list))) >> >> (assign-var (var ...) expr-list) >> expr-list))) >> >> >> ;;(<- x 5) >> ((_ var expr) >> >> (begin >> ;;(display "<- : variable set!") (newline) >> (set! var expr) >> var)) >> >> >> ;; (declare x y z t) >> ;; {x <- y <- z <- t <- 7} >> ;; 7 >> ;; (list x y z t) >> ;; (7 7 7 7) >> >> ;; (declare I) >> ;; {I <- (make-array 0 4 4)} >> ;; #2((0 0 0 0) >> ;; (0 0 0 0) >> ;; (0 0 0 0) >> ;; (0 0 0 0)) >> ;; >> ;; {I[0 0] <- I[1 1] <- I[2 2] <- I[3 3] <- 1} >> ;; 1 >> ;; >> ;; I >> ;; #2((1 0 0 0) >> ;; (0 1 0 0) >> ;; (0 0 1 0) >> ;; (0 0 0 1)) >> >> ((_ var var1 var2 ...) ;; there is an expression in the last part of >> ellipsis! >> (<- var (<- var1 var2 ...))) >> >> )) >> >> >> ;; > (declare x y z) >> ;; > (assign-var (x y z) (1 2 3)) >> ;; > x >> ;; 1 >> ;; > y >> ;; 2 >> ;; > z >> ;; 3 >> (define-syntax assign-var >> (syntax-rules () >> >> ((_ (var ...) (exp ...)) (begin (set! var exp) ...)))) >> >> i'm cross developping in Guile and Racket and i'm sure Guile will do as >> Racket and here is the result: >> >> Bienvenue dans DrRacket, version 7.7 [3m]. >> Langage: reader "../SRFI/SRFI-105.rkt", avec débogage; limite mémoire : >> 128 MB. >> > (declare x y z) >> > (define (foo) (display "inside foo") (newline) (values 1 2 3)) >> > (<- (x y z) (foo)) >> inside foo >> . . >> ../../../../../../../../usr/share/racket/collects/racket/private/kw.rkt:1201:25: >> result arity mismatch; >> expected number of values not received >> expected: 1 >> received: 3 >> values...: >> > (define T (make-vector 5)) >> > {T[2] <- 1} >> 1 >> . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: >> (assign-var ($bracket-apply$ T 2) expr-list) >> > (<- T[2] 1) >> . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: >> (assign-var (2) expr-list) >> > (<- ($bracket-apply$ T 2) 1) >> 1 >> . ../required-files/assignment.rkt:140:7: assign-var: bad syntax in: >> (assign-var ($bracket-apply$ T 2) expr-list) >> > >> >> the problem is that anyway i do it when using reserved keyword in >> define-syntax the macro use the third case: >> (_ (var ...) expr) >> even when i have : >> >> (syntax-rules ($bracket-apply$) >> >> ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T >> 4)) >> >> ;; one dimension array, example: {a[4] <- 7} >> ;; $bracket-apply$ of SRFI 105 >> ((_ ($bracket-apply$ container index) expr) >> >> >> with (<- ($bracket-apply$ T 2) 1) entered at toplevel i should not be in >> the third case but the first of the macro <- >> >> that is strange... i think i could not get help from mailing list on a so >> complex example that rely on my Scheme+ development for multiple values >> return (aka let-values replacment with <- ), >> sorry for the inconvenience >> Damien >> >> >> On Wed, Feb 2, 2022 at 11:33 AM Maxime Devos <maximedevos@telenet.be> >> wrote: >> >>> Damien Mattei schreef op wo 02-02-2022 om 11:13 [+0100]: >>> > (define-syntax macro >>> > (syntax-rules () >>> > ((_ arg1 arg2) code1) >>> > ((_ reserved-keyword arg) code2))) >>> >>> The rules are matched in-order, so when the first rule matches, the >>> second rule is ignored. I suggest: >>> >>> (define-syntax macro >>> (syntax-rules (reserved-keyword) >>> ((_ reserved-keyword arg) code2) >>> ((_ arg1 arg2) code1))) >>> >>> Greetings, >>> Maxime >>> >>> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: reserved-keyword in macro 2022-02-02 21:38 ` Damien Mattei @ 2022-02-03 0:52 ` Vijay Marupudi 2022-02-03 10:09 ` Damien Mattei 0 siblings, 1 reply; 10+ messages in thread From: Vijay Marupudi @ 2022-02-03 0:52 UTC (permalink / raw) To: Damien Mattei, guile-user Hi Damien, I tried to run the code you provided. I ran ----------------------------------------------------------------- (define-syntax <- (syntax-rules ($bracket-apply$) ((_ ($bracket-apply$ container index) expr) (let ((value expr)) ;; to avoid compute it twice (cond ((vector? container) (vector-set! container index value)) ((hash-table? container) (hash-table-set! container index value)) (else (array-set! container index value)));) value)) ((_ ($bracket-apply$ array index1 index2 ...) expr) (let ((value expr)) (if (vector? array) (array-n-dim-set! array value index1 index2 ...) (array-set! array index1 index2 ... value));) (newline) value)) ((_ (var ...) expr) (begin (display expr) (newline) (let ((expr-list (call-with-values (lambda () expr) list))) (assign-var (var ...) expr-list) expr-list))) ((_ var expr) (begin (set! var expr) var)) ((_ var var1 var2 ...) (<- var (<- var1 var2 ...))))) (define T (make-vector 5)) (<- ($bracket-apply$ T 2) 1) ----------------------------------------------------------------- After I ran that, T was #(#<unspecified> #<unspecified> 1 #<unspecified> #<unspecified>) Is that was you are looking for? > "A literal matches an input expression if the input expression is an > identifier with the same name as the literal, and both are unbound13 > <https://www.gnu.org/software/guile/manual/html_node/Syntax-Rules.html#FOOT13>. > " as $bracket-apply$ is already bind to a definition the pattern will > not be matched: It's possible, as in my case, I did not have it bound, and it seems to have worked the way you expected? ~ Vijay ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: reserved-keyword in macro 2022-02-03 0:52 ` Vijay Marupudi @ 2022-02-03 10:09 ` Damien Mattei 2022-02-04 8:21 ` Damien Mattei 0 siblings, 1 reply; 10+ messages in thread From: Damien Mattei @ 2022-02-03 10:09 UTC (permalink / raw) To: Vijay Marupudi; +Cc: guile-user oh :-O yes it is the behavior expected : assign the 2nd element of an array T with value 1 : prefix notation of : (<- ($bracket-apply$ T 2) 1) is equivalent in Curly Infix syntax to : {T[2] <- 1} as expected when $bracket-apply$ is not bound we have the good result. Thanks for this result. Of course in this case {T[2] <- 1} it is not a problem to have not $bracket-apply$ bound, things became harder when doing : {T[2] <- T[4]} for example because then i want to assign the result value of T[4] to T[2] and so i need to evaluate T[4] before which is exactly ($bracket-apply$ T 4) and at this point $bracket-apply$ is bind to: (define-syntax $bracket-apply$ (syntax-rules () ((_ container index) ;(begin ;;(display "$bracket-apply$") (newline) (cond ((vector? container) (vector-ref container index)) ((hash-table? container) (hash-table-ref container index)) (else (array-ref container index))));) ((_ array index1 index2 ...) ;(begin ;;(display "$bracket-apply$") (newline) (if (vector? array) (array-n-dim-ref array index1 index2 ...) (array-ref array index1 index2 ...)))));) and is used in the RHS (right-hand side) of: {T[2] <- T[4]} which expand in Curly Infix SRFI-105 to: (<- ($bracket-apply$ T 2) ($bracket-apply$ T 4)) and then is expanded in Scheme+ in two phases: first the RHS expr is evaluate in : ((_ ($bracket-apply$ container index) expr) (let ((value expr)) ;; to avoid compute it twice in : (array-ref T 4) but the LHS (Left hand side) is not evaluated with $bracket-apply$ but with the macro <- in the body of let : (cond ((vector? container) (vector-set! container index value)) which give : (vector-set! T 2 value) where value is the value of expr, previously expanded and evaluated. And we get the good result. But for this we need to have sometimes $bracket-apply$ as a bound macro (or procedure) and sometimes not, being a reserved keyword NOT bound. This for me obscure WHY the keyword in syntax-rules MUST not be bound to behave correctly but this is like that in Scheme standarts and we have to deal with. I already faced this problem earlier and the solution is in the previously commented code: ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test funct-or-macro equal $bracket-apply$ which can only be understood knowing that the macro was in the past declared like this and commented code does not match present code,here is the previous definition of <- : (syntax-rules () ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T 4)) ;; one dimension array, example: {a[4] <- 7} ;; $bracket-apply$ of SRFI 105 ((_ (funct-or-macro container index) expr) (let ((value expr)) ;; to avoid compute it twice ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test funct-or-macro equal $bracket-apply$ ;; normal case ;; {T[2] <- 4} ;; {T[3] <- T[2]} (cond ((vector? container) (vector-set! container index value)) ((hash-table? container) (hash-table-set! container index value)) (else (array-set! container index value))) value)) so the solution will be to remove $bracket-apply$ as literal in: (define-syntax <- (syntax-rules ($bracket-apply$) and some check manually in the macro with: (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test funct-or-macro equal $bracket-apply$ to branch instead of using pattern matching. i will code this later but this was of great help,thanks again all. Damien On Thu, Feb 3, 2022 at 1:52 AM Vijay Marupudi <vijaymarupudi@gatech.edu> wrote: > Hi Damien, > > I tried to run the code you provided. I ran > > ----------------------------------------------------------------- > > (define-syntax <- > (syntax-rules ($bracket-apply$) > ((_ ($bracket-apply$ container index) expr) > (let ((value expr)) ;; to avoid compute it twice > (cond ((vector? container) (vector-set! container index value)) > ((hash-table? container) (hash-table-set! container index > value)) > (else (array-set! container index value)));) > value)) > ((_ ($bracket-apply$ array index1 index2 ...) expr) > (let ((value expr)) > (if (vector? array) > (array-n-dim-set! array value index1 index2 ...) > (array-set! array index1 index2 ... value));) > (newline) > value)) > ((_ (var ...) expr) > (begin > (display expr) (newline) > (let ((expr-list (call-with-values (lambda () expr) list))) > (assign-var (var ...) expr-list) > expr-list))) > ((_ var expr) > (begin > (set! var expr) > var)) > ((_ var var1 var2 ...) > (<- var (<- var1 var2 ...))))) > > (define T (make-vector 5)) > (<- ($bracket-apply$ T 2) 1) > > ----------------------------------------------------------------- > > After I ran that, T was > > #(#<unspecified> #<unspecified> 1 #<unspecified> #<unspecified>) > > Is that was you are looking for? > > > "A literal matches an input expression if the input expression is an > > identifier with the same name as the literal, and both are unbound13 > > < > https://www.gnu.org/software/guile/manual/html_node/Syntax-Rules.html#FOOT13 > >. > > " as $bracket-apply$ is already bind to a definition the pattern will > > not be matched: > > It's possible, as in my case, I did not have it bound, and it seems to > have worked the way you expected? > > ~ Vijay > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: reserved-keyword in macro 2022-02-03 10:09 ` Damien Mattei @ 2022-02-04 8:21 ` Damien Mattei 2022-02-04 16:24 ` Damien Mattei 0 siblings, 1 reply; 10+ messages in thread From: Damien Mattei @ 2022-02-04 8:21 UTC (permalink / raw) To: guile-user definitely i do not think it is possible to have a macro doing this: {(x y z) <- (foo)} ;; foo is a function that return 3 values (ex: (values 1 2 3)) or this : {(x y z ...) <- (bar)} ;; bar return an arbitrary (known in advance ) number of values and also have a compatibility with: {T[2] <- T[1]} that deal with arrays $bracket-apply$ and syntax-rules is not enough i think i will have to use $nfx$ overloading from SRFI-105 for doing almost the same: {x y z <- (foo)} which i admit is more Haskell style than Scheme On Thu, Feb 3, 2022 at 11:09 AM Damien Mattei <damien.mattei@gmail.com> wrote: > oh :-O yes it is the behavior expected : assign the 2nd element of an > array T with value 1 : > prefix notation of : (<- ($bracket-apply$ T 2) 1) is equivalent in Curly > Infix syntax to : {T[2] <- 1} > as expected when $bracket-apply$ is not bound we have the good result. > Thanks for this result. > Of course in this case {T[2] <- 1} it is not a problem to have not $bracket-apply$ > bound, > things became harder when doing : {T[2] <- T[4]} for example because then > i want to assign the result value of T[4] to T[2] and so i need to > evaluate T[4] before which is exactly > ($bracket-apply$ T 4) and at this point $bracket-apply$ is bind to: > (define-syntax $bracket-apply$ > (syntax-rules () > > ((_ container index) > ;(begin ;;(display "$bracket-apply$") (newline) > (cond ((vector? container) (vector-ref container index)) > ((hash-table? container) (hash-table-ref container index)) > (else (array-ref container index))));) > > ((_ array index1 index2 ...) > ;(begin ;;(display "$bracket-apply$") (newline) > (if (vector? array) > (array-n-dim-ref array index1 index2 ...) > (array-ref array index1 index2 ...)))));) > > and is used in the RHS (right-hand side) of: > {T[2] <- T[4]} which expand in Curly Infix SRFI-105 to: > (<- ($bracket-apply$ T 2) ($bracket-apply$ T 4)) > and then is expanded in Scheme+ in two phases: > first the RHS expr is evaluate in : > ((_ ($bracket-apply$ container index) expr) > (let ((value expr)) ;; to avoid compute it twice > in : (array-ref T 4) > but the LHS (Left hand side) is not evaluated with $bracket-apply$ but > with the macro <- > in the body of let : > (cond ((vector? container) (vector-set! container index value)) > which give : > (vector-set! T 2 value) where value is the value of expr, previously > expanded and evaluated. > And we get the good result. > But for this we need to have sometimes $bracket-apply$ as a bound macro > (or procedure) and sometimes not, being a reserved keyword NOT bound. > This for me obscure WHY the keyword in syntax-rules MUST not be bound to > behave correctly but this is like that in Scheme standarts and we have to > deal with. > I already faced this problem earlier and the solution is in the previously > commented code: > ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test > funct-or-macro equal $bracket-apply$ > which can only be understood knowing that the macro was in the past > declared like this and commented code does not match present code,here is > the previous definition of <- : > (syntax-rules () > > ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T > 4)) > > ;; one dimension array, example: {a[4] <- 7} > ;; $bracket-apply$ of SRFI 105 > ((_ (funct-or-macro container index) expr) > (let ((value expr)) ;; to avoid compute it twice > > ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; > test funct-or-macro equal $bracket-apply$ > > ;; normal case > ;; {T[2] <- 4} > ;; {T[3] <- T[2]} > > (cond ((vector? container) (vector-set! container index value)) > ((hash-table? container) (hash-table-set! container index > value)) > (else (array-set! container index value))) > value)) > > so the solution will be to remove $bracket-apply$ as literal in: > (define-syntax <- > (syntax-rules ($bracket-apply$) > > and some check manually in the macro with: > (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test > funct-or-macro equal $bracket-apply$ > to branch instead of using pattern matching. > i will code this later but this was of great help,thanks again all. > > Damien > > On Thu, Feb 3, 2022 at 1:52 AM Vijay Marupudi <vijaymarupudi@gatech.edu> > wrote: > >> Hi Damien, >> >> I tried to run the code you provided. I ran >> >> ----------------------------------------------------------------- >> >> (define-syntax <- >> (syntax-rules ($bracket-apply$) >> ((_ ($bracket-apply$ container index) expr) >> (let ((value expr)) ;; to avoid compute it twice >> (cond ((vector? container) (vector-set! container index value)) >> ((hash-table? container) (hash-table-set! container index >> value)) >> (else (array-set! container index value)));) >> value)) >> ((_ ($bracket-apply$ array index1 index2 ...) expr) >> (let ((value expr)) >> (if (vector? array) >> (array-n-dim-set! array value index1 index2 ...) >> (array-set! array index1 index2 ... value));) >> (newline) >> value)) >> ((_ (var ...) expr) >> (begin >> (display expr) (newline) >> (let ((expr-list (call-with-values (lambda () expr) list))) >> (assign-var (var ...) expr-list) >> expr-list))) >> ((_ var expr) >> (begin >> (set! var expr) >> var)) >> ((_ var var1 var2 ...) >> (<- var (<- var1 var2 ...))))) >> >> (define T (make-vector 5)) >> (<- ($bracket-apply$ T 2) 1) >> >> ----------------------------------------------------------------- >> >> After I ran that, T was >> >> #(#<unspecified> #<unspecified> 1 #<unspecified> #<unspecified>) >> >> Is that was you are looking for? >> >> > "A literal matches an input expression if the input expression is an >> > identifier with the same name as the literal, and both are unbound13 >> > < >> https://www.gnu.org/software/guile/manual/html_node/Syntax-Rules.html#FOOT13 >> >. >> > " as $bracket-apply$ is already bind to a definition the pattern will >> > not be matched: >> >> It's possible, as in my case, I did not have it bound, and it seems to >> have worked the way you expected? >> >> ~ Vijay >> > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: reserved-keyword in macro 2022-02-04 8:21 ` Damien Mattei @ 2022-02-04 16:24 ` Damien Mattei 2022-02-04 16:44 ` Maxime Devos 0 siblings, 1 reply; 10+ messages in thread From: Damien Mattei @ 2022-02-04 16:24 UTC (permalink / raw) To: guile-user even with $nfx$ it does not seem to be possible without set!-values: https://docs.racket-lang.org/reference/set_.html#%28form._%28%28lib._racket%2Fprivate%2Fmore-scheme..rkt%29._set%21-values%29%29 does someone know how to implement set!-values in Scheme for Guile? with set!-values things are really easy: (define-syntax <+ (syntax-rules () ((_ (var1 ...) expr) (begin (define var1 '()) ... (display "<+ multiple") (newline) (set!-values (var1 ...) expr))) ((_ var expr) (begin (display "<+ single") (newline) (define var expr) (display var) (newline))))) Welcome to DrRacket, version 8.2 [cs]. Language: reader "../SRFI/SRFI-105.rkt", with debugging; memory limit: 128 MB. > (define (foo) (values 1 2 3)) > {(x y z) <+ (foo)} <+ multiple > x 1 > y 2 (define-syntax </ (syntax-rules () ((</ (x ...) expr) (set!-values (x ...) expr)))) > (declare x y z) > {(x y z) </ (foo)} > x 1 > y 2 > z 3 On Fri, Feb 4, 2022 at 9:21 AM Damien Mattei <damien.mattei@gmail.com> wrote: > definitely i do not think it is possible to have a macro doing this: > {(x y z) <- (foo)} ;; foo is a function that return 3 values (ex: (values > 1 2 3)) > or this : > {(x y z ...) <- (bar)} ;; bar return an arbitrary (known in advance ) > number of values > and also have a compatibility with: > {T[2] <- T[1]} that deal with arrays > > $bracket-apply$ and syntax-rules is not enough i think i will have to use > $nfx$ overloading from SRFI-105 for doing almost the same: > {x y z <- (foo)} which i admit is more Haskell style than Scheme > > On Thu, Feb 3, 2022 at 11:09 AM Damien Mattei <damien.mattei@gmail.com> > wrote: > >> oh :-O yes it is the behavior expected : assign the 2nd element of an >> array T with value 1 : >> prefix notation of : (<- ($bracket-apply$ T 2) 1) is equivalent in Curly >> Infix syntax to : {T[2] <- 1} >> as expected when $bracket-apply$ is not bound we have the good result. >> Thanks for this result. >> Of course in this case {T[2] <- 1} it is not a problem to have not $bracket-apply$ >> bound, >> things became harder when doing : {T[2] <- T[4]} for example because then >> i want to assign the result value of T[4] to T[2] and so i need to >> evaluate T[4] before which is exactly >> ($bracket-apply$ T 4) and at this point $bracket-apply$ is bind to: >> (define-syntax $bracket-apply$ >> (syntax-rules () >> >> ((_ container index) >> ;(begin ;;(display "$bracket-apply$") (newline) >> (cond ((vector? container) (vector-ref container index)) >> ((hash-table? container) (hash-table-ref container index)) >> (else (array-ref container index))));) >> >> ((_ array index1 index2 ...) >> ;(begin ;;(display "$bracket-apply$") (newline) >> (if (vector? array) >> (array-n-dim-ref array index1 index2 ...) >> (array-ref array index1 index2 ...)))));) >> >> and is used in the RHS (right-hand side) of: >> {T[2] <- T[4]} which expand in Curly Infix SRFI-105 to: >> (<- ($bracket-apply$ T 2) ($bracket-apply$ T 4)) >> and then is expanded in Scheme+ in two phases: >> first the RHS expr is evaluate in : >> ((_ ($bracket-apply$ container index) expr) >> (let ((value expr)) ;; to avoid compute it twice >> in : (array-ref T 4) >> but the LHS (Left hand side) is not evaluated with $bracket-apply$ but >> with the macro <- >> in the body of let : >> (cond ((vector? container) (vector-set! container index value)) >> which give : >> (vector-set! T 2 value) where value is the value of expr, previously >> expanded and evaluated. >> And we get the good result. >> But for this we need to have sometimes $bracket-apply$ as a bound macro >> (or procedure) and sometimes not, being a reserved keyword NOT bound. >> This for me obscure WHY the keyword in syntax-rules MUST not be bound to >> behave correctly but this is like that in Scheme standarts and we have to >> deal with. >> I already faced this problem earlier and the solution is in the >> previously commented code: >> ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test >> funct-or-macro equal $bracket-apply$ >> which can only be understood knowing that the macro was in the past >> declared like this and commented code does not match present code,here is >> the previous definition of <- : >> (syntax-rules () >> >> ;; special form like : (<- ($bracket-apply$ T 3) ($bracket-apply$ T >> 4)) >> >> ;; one dimension array, example: {a[4] <- 7} >> ;; $bracket-apply$ of SRFI 105 >> ((_ (funct-or-macro container index) expr) >> (let ((value expr)) ;; to avoid compute it twice >> >> ;; (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; >> test funct-or-macro equal $bracket-apply$ >> >> ;; normal case >> ;; {T[2] <- 4} >> ;; {T[3] <- T[2]} >> >> (cond ((vector? container) (vector-set! container index value)) >> ((hash-table? container) (hash-table-set! container >> index value)) >> (else (array-set! container index value))) >> value)) >> >> so the solution will be to remove $bracket-apply$ as literal in: >> (define-syntax <- >> (syntax-rules ($bracket-apply$) >> >> and some check manually in the macro with: >> (if (equal? (quote $bracket-apply$) (quote funct-or-macro)) ;; test >> funct-or-macro equal $bracket-apply$ >> to branch instead of using pattern matching. >> i will code this later but this was of great help,thanks again all. >> >> Damien >> >> On Thu, Feb 3, 2022 at 1:52 AM Vijay Marupudi <vijaymarupudi@gatech.edu> >> wrote: >> >>> Hi Damien, >>> >>> I tried to run the code you provided. I ran >>> >>> ----------------------------------------------------------------- >>> >>> (define-syntax <- >>> (syntax-rules ($bracket-apply$) >>> ((_ ($bracket-apply$ container index) expr) >>> (let ((value expr)) ;; to avoid compute it twice >>> (cond ((vector? container) (vector-set! container index value)) >>> ((hash-table? container) (hash-table-set! container index >>> value)) >>> (else (array-set! container index value)));) >>> value)) >>> ((_ ($bracket-apply$ array index1 index2 ...) expr) >>> (let ((value expr)) >>> (if (vector? array) >>> (array-n-dim-set! array value index1 index2 ...) >>> (array-set! array index1 index2 ... value));) >>> (newline) >>> value)) >>> ((_ (var ...) expr) >>> (begin >>> (display expr) (newline) >>> (let ((expr-list (call-with-values (lambda () expr) list))) >>> (assign-var (var ...) expr-list) >>> expr-list))) >>> ((_ var expr) >>> (begin >>> (set! var expr) >>> var)) >>> ((_ var var1 var2 ...) >>> (<- var (<- var1 var2 ...))))) >>> >>> (define T (make-vector 5)) >>> (<- ($bracket-apply$ T 2) 1) >>> >>> ----------------------------------------------------------------- >>> >>> After I ran that, T was >>> >>> #(#<unspecified> #<unspecified> 1 #<unspecified> #<unspecified>) >>> >>> Is that was you are looking for? >>> >>> > "A literal matches an input expression if the input expression is an >>> > identifier with the same name as the literal, and both are unbound13 >>> > < >>> https://www.gnu.org/software/guile/manual/html_node/Syntax-Rules.html#FOOT13 >>> >. >>> > " as $bracket-apply$ is already bind to a definition the pattern will >>> > not be matched: >>> >>> It's possible, as in my case, I did not have it bound, and it seems to >>> have worked the way you expected? >>> >>> ~ Vijay >>> >> ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: reserved-keyword in macro 2022-02-04 16:24 ` Damien Mattei @ 2022-02-04 16:44 ` Maxime Devos 0 siblings, 0 replies; 10+ messages in thread From: Maxime Devos @ 2022-02-04 16:44 UTC (permalink / raw) To: Damien Mattei, guile-user [-- Attachment #1.1: Type: text/plain, Size: 953 bytes --] Damien Mattei schreef op vr 04-02-2022 om 17:24 [+0100]: > even with $nfx$ it does not seem to be possible without set!-values: > https://docs.racket-lang.org/reference/set_.html#%28form._%28%28lib._racket%2Fprivate%2Fmore-scheme..rkt%29._set%21-values%29%29 > > does someone know how to implement set!-values in Scheme for Guile? This is not Guile-specific, it works in any Scheme with syntax-rules, by using a form of recursion, call-with-values, set!, lambda and values, see attachement (LGPL3.0+ licensed). Also, Racket is free software, so you could look at the source code of Racket, maybe Racket's implementation can be ported to Guile Scheme and maybe it's already valid Guile Scheme. > On Fri, Feb 4, 2022 at 9:21 AM Damien Mattei <damien.mattei@gmail.com> > wrote: > [ a huge block of text ] This block of text does not appear to have anything to do with your question, what is it included for? Greetings, Maxime. [-- Attachment #1.2: Type: text/plain, Size: 1149 bytes --] ;;; Copyright © 2022 Maxime Devos ;;; ;;; This library is free software: you can redistribute it and/or modify ;;; it under the terms of the GNU Lesser General Public License as ;;; published by the Free Software Foundation, either version 3 of the ;;; License, or (at your option) any later version. ;;; ;;; This library is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;;; Lesser General Public License for more details. ;;; ;;; You should have received a copy of the GNU Lesser General Public ;;; License along with this program. If not, see ;;; <http://www.gnu.org/licenses/>. (define-syntax set!-values (syntax-rules () ((_ (var var* ...) exp) (call-with-values (lambda () exp) (lambda (value . rest) (set! var value) (set!-values (var* ...) (apply values rest))))) ((_ () exp) (call-with-values (lambda () exp) (lambda () (values)))))) ; nothing to do! (define x) (define y) (define z) (set!-values (x y z) (values 0 1 2)) (pk x y z) [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 260 bytes --] ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2022-02-04 16:44 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-02-02 10:13 reserved-keyword in macro Damien Mattei 2022-02-02 10:33 ` Maxime Devos [not found] ` <CADEOaddzjFbSYvVGEOkrSrjHSZvUkqC9beiRw29jbH3XHeRkZw@mail.gmail.com> 2022-02-02 13:02 ` Fwd: " Damien Mattei 2022-02-02 21:23 ` Damien Mattei 2022-02-02 21:38 ` Damien Mattei 2022-02-03 0:52 ` Vijay Marupudi 2022-02-03 10:09 ` Damien Mattei 2022-02-04 8:21 ` Damien Mattei 2022-02-04 16:24 ` Damien Mattei 2022-02-04 16:44 ` Maxime Devos
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).