taylanbayi...@gmail.com (Taylan Ulrich "Bayırlı/Kammer") writes:
> l...@gnu.org (Ludovic Courtès) writes: > >> One related thing I sometimes lack is: >> >> (define-syntax-rule (thunk exp ...) >> (lambda () exp ...)) > > My understanding is that that'd be (^ exp ...). That's true given the code I posted, but it was not intentional. I meant to follow Gauche's convention that '^' is an alias for 'lambda', so you'd need to type (^() exp ...) instead. Another bug is that I should have used (expand load eval) in the 'eval-when'. Finally, I've decided that it's nicer to export 'define-short-lambda' than 'short-lambda'. Here's an updated version. More thoughts? Alas, I guess this entire topic is bikeshed territory :) Mark
(define-module (ice-9 short-lambdas) #:export (^ ^_ λ_ ^a ^b ^c ^d ^e ^f ^g ^h ^i ^j ^k ^l ^m ^n ^o ^p ^q ^r ^s ^t ^u ^v ^w ^x ^y ^z ^xy ^xyz ^ab ^abc ^uv λa λb λc λd λe λf λg λh λi λj λk λl λm λn λo λp λq λr λs λt λu λv λw λx λy λz λxy λxyz λab λabc λuv define-short-lambda)) (eval-when (expand load eval) (define short-lambda (lambda (form) (syntax-case form () ((k-id body0 body ...) (let* ((k-symbol (syntax->datum #'k-id)) (k-name (symbol->string k-symbol)) (chars (cdr (string->list k-name))) (names (map string chars)) (symbols (map string->symbol names))) (define (sym->id sym) (case sym ((_) (car (generate-temporaries '(_)))) (else (datum->syntax #'k-id sym)))) (with-syntax ((ids (map sym->id symbols))) #'(lambda ids body0 body ...)))))))) (define-syntax-rule (define-short-lambda k) (define-syntax k short-lambda)) (define-syntax-rule (define-short-lambdas k ...) (begin (define-short-lambda k) ...)) (define-syntax-rule (^ formals body0 body ...) (lambda formals body0 body ...)) (define-short-lambdas ^_ λ_ ^a ^b ^c ^d ^e ^f ^g ^h ^i ^j ^k ^l ^m ^n ^o ^p ^q ^r ^s ^t ^u ^v ^w ^x ^y ^z ^xy ^xyz ^ab ^abc ^uv λa λb λc λd λe λf λg λh λi λj λk λl λm λn λo λp λq λr λs λt λu λv λw λx λy λz λxy λxyz λab λabc λuv)