说我们有这样的事情:
;list L of n procedure definitions, where a procedure definition is a list in form:
;<name> <body>
;for example: ((n1 (+ 1 1)) (n2 (- 1 0)) (n3 (* 2 2))), where n = 3, n1 is the name of
;first procedure in list L and (+ 1 1) is its body.
现在我希望创建n个本地绑定。基于上面的例子,像这样:
(define foo
(let* ((n1 (lambda () (+ 1 1)
(n2 (lambda () (- 1 0)
(n3 (lambda () (* 2 2))
(n1) ;newly defined procedure calls
(n2)
))
在这里硬编码,有没有办法在没有硬编码的情况下创建n个本地绑定?就像读取n个过程的列表一样,直到它为空并且对于里面的每个过程定义,在let *中创建它的本地绑定?
提前谢谢。
答案 0 :(得分:1)
以下是宏的示例。
#lang racket
(require (for-syntax syntax/parse))
(define-syntax (define-locals stx)
(syntax-parse stx
[(_define-locals ([name expr] ...) body ...)
#'(let ([name (lambda () expr)] ...) body ...)]))
(define-locals ((n1 (+ 1 1)) (n2 (- 1 0)) (n3 (* 2 2)))
(list (n1)
(n2)
(n3)))
结果是:
'(2 1 4)