Mapping 方案:映射let和set!列入名单
我正在尝试地图让和设置!上面列出了如下内容:Mapping 方案:映射let和set!列入名单,mapping,scheme,syntax-error,racket,Mapping,Scheme,Syntax Error,Racket,我正在尝试地图让和设置!上面列出了如下内容: (map (lambda (x) (let ((x #f)))) <list>) 并使用match lambda将其转换为仅使用let和set的等效调用!这是我尝试模拟的模板: (letrec ((var val) ...) expr0 expr1 ...) ==> 问题是将其转换为匹配lambda接受的语法。以下是我正在研究的内容,假设有一种方法可以完成最初的问题: (match-rewriter (`(letrec((,<v
(map (lambda (x) (let ((x #f)))) <list>)
并使用match lambda将其转换为仅使用let和set的等效调用!这是我尝试模拟的模板:
(letrec ((var val) ...) expr0 expr1 ...)
==>
问题是将其转换为匹配lambda接受的语法。以下是我正在研究的内容,假设有一种方法可以完成最初的问题:
(match-rewriter (`(letrec((,<var> ,<val>) ...) ,<expr> ...)
`((map (λ (x) (let ((x #f)))) ,<var>)
(let ((temp ,<val>)))
(map set! ,<var> temp)
(let () ,@<expr>))))
(匹配重写器(`(letrec(,),…),…)
`((map(λ(x)(let((x#f)))),)
(让((温度,))
(地图集,临时)
(let(),@)))
任何建议都将不胜感激
谢谢。你不能那样做。除了使用
eval
,变量名通常不允许是动态的(基本上是非符号文字的任何内容)。这是故意的
如果您的变量名实际上是文字,并且您只想一次绑定多个变量,那么可以使用let values
()或extendedlet
()
编辑以匹配OP的编辑:您想要做的听起来像。但是,该宏使用的是
语法大小写
,而不是匹配lambda
等。不过,您可以将其用作起点。这是您想要的代码:
(define (rewrite-letrec l)
(match l
[(list 'letrec (list (list vars rhss) ...)
exprs ...)
(let ([tmps (map (λ _ (gensym)) vars)])
`(let (,(map (λ (v) `(,v #f)) vars))
(let (,(map (λ (tmp rhs) `(,tmp ,rhs)) tmps rhss))
,@(map (λ (v t) `(set! ,v ,t)))
(let () ,@exprs))))]))
这里有几个不同之处。一个是
let
s是嵌套的。其次,我们在构造代码,而不是试图运行它。@Schemer:你的意思是你想做这样的事情?(参见示例中的letrec
定义)。但是,它使用的是语法大小写
,而不是匹配重写器
。不幸的是,我不得不使用match lambda。我需要写一个规则letrec→让我们开始吧!该模式使用match lambda匹配对letrec的调用,并返回一个仅使用let和set的等效规则。问题似乎在于match lambda语法不如define语法强大。
(let ((var #f) ...)
(let ((temp val) ...)
(set! var temp) ...
(let () expr0 expr1 ...)))
(match-rewriter (`(letrec((,<var> ,<val>) ...) ,<expr> ...)
`((map (λ (x) (let ((x #f)))) ,<var>)
(let ((temp ,<val>)))
(map set! ,<var> temp)
(let () ,@<expr>))))
(define (rewrite-letrec l)
(match l
[(list 'letrec (list (list vars rhss) ...)
exprs ...)
(let ([tmps (map (λ _ (gensym)) vars)])
`(let (,(map (λ (v) `(,v #f)) vars))
(let (,(map (λ (tmp rhs) `(,tmp ,rhs)) tmps rhss))
,@(map (λ (v t) `(set! ,v ,t)))
(let () ,@exprs))))]))