======slambda.scm====== #!/usr/bin/env racket #lang racket (require compatibility/defmacro) napište makro slambda, které se bude chovat identicky jako speciální forma lambda v jazyku Scheme, ale navíc umožní ve svém těle získat kód sebe sama prostřednictvím vazby symbolu self. ((slambda () 10)) ;=> 10 ((slambda (x) (+ x 1)) 10) ;=> 11 ((slambda () self)) ;=> (slambda () self) ((slambda (x) (list (+ x 1) self)) 10) ;=> ??? ((slambda () (slambda () self) self)) ;=> (slambda () (slambda () self) self) * Hmm, k čemu se //self// dá využít? jako [[#rec]]? * Hmm, [[#kod sebe sama]] ??? nebo odkazovat na sebe? ======define-macro a letrec====== (define-macro slambda1 (lambda (args body) `(letrec ((self (lambda ,args ,body))) self ))) ((slambda1 () 10)) ((slambda1 (x) (+ x 1)) 10) ((slambda1 () self)) ;=> (slambda () self) resp # ((slambda1 (x) (list (+ x 1) self)) 10) ;=> '(1 # ??? vyssi rad? ;((slambda1 () (slambda1 () self) self)) ;=> (slambda () (slambda () self) self) http://stackoverflow.com/questions/23167464/scheme-self-reference-lambda-macro, uživatel **poody** je student UPOL ;-) ======rec====== rec definujeme si sami, mohli bychom (require [[http://srfi.schemers.org/srfi-31/srfi-31.html|srfi/31]]) (define-syntax rec (syntax-rules () ((_ (id . params) body ...) (rec id (lambda params body ...))) ((_ id value) (letrec ((id value)) id)))) (require racket/stxparam) (define-syntax-parameter self (lambda (stx) (raise-syntax-error 'self "Can only be used inside slambda"))) (define-syntax slambda (syntax-rules () ((_ params body ...) (rec (ohai . params) (syntax-parameterize ((self (make-rename-transformer #'ohai))) body ...))))) ((slambda () 10)) ((slambda (x) (+ x 1)) 10) ((slambda () self)) ;=> (slambda () self) resp # '(1 # vyssi rad? ((slambda () (slambda () self) self)) ;=> (slambda () (slambda () self) self) ======kod sebe sama====== Hmm, "kod sebe sama" ??? nebo odkazovat na sebe? (define-macro selambda (lambda (args body) `(letrec ((self (list 'selambda ',args ',body))) ;"kod sebe sama" (lambda ,args ,body) ))) ((selambda () 10)) ((selambda (x) (+ x 1)) 10) ((selambda () self)) ;=> (selambda () self) nebo # ??? ((selambda (x) (list (+ x 1) self)) 10) ;=> jaky ma byt vysledek??? nasl je podivne: ;((selambda () (selambda () self) self)) ;=> (slambda () (slambda () self) self) ;^^^^^__ spravne zadani? další? linky/zdroje: * http://stackoverflow.com/questions/7936024/anonymous-lambdas-directly-referring-to-themselves vim: syntax=racket