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
()或extended
let
()



编辑以匹配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))))]))