创建n个本地绑定

时间:2017-03-12 14:56:00

标签: functional-programming scheme racket

说我们有这样的事情:

;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 *中创建它的本地绑定?

提前谢谢。

1 个答案:

答案 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)