这是从方案中的两个列表创建lambda的正确方法吗?

时间:2016-07-22 19:28:50

标签: lambda scheme

我正在尝试使用参数创建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)))

正确的方式是什么?

2 个答案:

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