我正在尝试使用参数创建lambda,(apply (make-lambda '(a b) '(+ a b)) '(1 2))
返回3
我的第一次尝试(define (make-lambda params func) (lambda params func))
返回(+ a b)
此代码有效,但对我来说感觉不对:(define (make-lambda params func) (eval (list 'lambda params func)))
正确的方式是什么?
答案 0 :(得分:2)
您必须评估列表以将其用作过程,否则只是一个恰好具有符号lambda
作为第一个元素的数据列表。这种语法有点简单,但基本相同:
(define (make-lambda params func)
(eval `(lambda ,params ,func)))
这应该有效:
(apply (make-lambda '(a b) '(+ a b)) '(1 2))
=> 3
或者,使用Leppie建议的宏:
(define-syntax make-lambda
(syntax-rules ()
((_ args body)
(lambda args body))))
像这样使用:
(apply (make-lambda (a b) (+ a b)) '(1 2))
=> 3
答案 1 :(得分:0)
因为我很无聊,而且你的计划支持syntax-case
:)
(define-syntax make-lambda
(lambda (x)
(syntax-case x (quote)
[(_ (quote pars) (quote body))
#'(lambda pars body)])))
PS:也可能与syntax-rules
合作(参见ÓscarLópez的回答)。所以我也很懒。
示例:http://eval.ironscheme.net/?id=186
这是syntax-rules
版本:
(define-syntax make-lambda
(syntax-rules (quote)
[(_ (quote pars) (quote body))
(lambda pars body)]))
示例:http://eval.ironscheme.net/?id=187
注意:请记住,这正是您要求的:D