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

这是从scheme中的两个列表创建lambda的正确方法吗?,lambda,scheme,Lambda,Scheme,我正在尝试从参数创建lambda,以便(apply(makelambda'(ab)“(+ab))”(12))返回3 我的第一次尝试(define(make lambda params func)(lambda params func))返回(+ab) 这段代码可以工作,但我觉得不太对劲:(定义(生成lambda参数func)(eval(列出lambda参数func)) 正确的方法是什么?您必须评估列表才能将其作为一个过程来使用,否则只是一个数据列表,刚好有符号lambda作为第一个元素。此语法稍

我正在尝试从参数创建lambda,以便
(apply(makelambda'(ab)“(+ab))”(12))
返回
3

我的第一次尝试
(define(make lambda params func)(lambda params func))
返回
(+ab)

这段代码可以工作,但我觉得不太对劲:
(定义(生成lambda参数func)(eval(列出lambda参数func))


正确的方法是什么?

您必须评估列表才能将其作为一个过程来使用,否则只是一个数据列表,刚好有符号
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

您必须对列表进行求值,才能将其用作过程,否则它只是一个数据列表,恰好以符号
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

因为我很无聊,如果您的方案支持
语法case
:)

PS:可能也会使用
语法规则
(参见奥斯卡·洛佩兹的答案)。所以我也很懒

例如:

以下是
语法规则
版本:

(define-syntax make-lambda
  (syntax-rules (quote)
    [(_ (quote pars) (quote body))
      (lambda pars body)]))
例如:


注意:请记住,这正是您所要求的:D

,因为我很无聊,如果您的方案支持
语法,请使用case
:)

PS:可能也会使用
语法规则
(参见奥斯卡·洛佩兹的答案)。所以我也很懒

例如:

以下是
语法规则
版本:

(define-syntax make-lambda
  (syntax-rules (quote)
    [(_ (quote pars) (quote body))
      (lambda pars body)]))
例如:


注意:请记住,这正是您想要的:D

如果可能,宏解决方案会更好。@leppie我感兴趣的不仅仅是让它工作。如果您有一个好的解决方案,请发布。很酷,我不确定
语法规则是否删除了引号:D@JohnK:您的输入是否始终为“文本”,或者对于其中一种或两种情况,它们是否都是可变的?传递给函数的文本将使lambda。。。所以变量。我不熟悉宏。。。这有什么不同?如果可能的话,宏解决方案会更好。@leppie我感兴趣的不仅仅是让它工作。如果您有一个好的解决方案,请发布。很酷,我不确定
语法规则是否删除了引号:D@JohnK:您的输入是否始终为“文本”,或者对于其中一种或两种情况,它们是否都是可变的?传递给函数的文本将使lambda。。。所以变量。我不熟悉宏。。。这有什么不同?这是在运行它的scheme环境中使用的还是您正在编写的scheme解释器的一部分?这两个问题需要不同的答案。我正在学习这个方案,希望确保我的解决方案不会难看。你给我的印象是,你需要在运行时生成过程
eval
是唯一一个这样做的结构。通常,使用这个和eval对优化有很大的影响,所以如果你给我们一个如何使用这个的例子,我们可能会一起想出一个更好的解决方案。通常将lambda和闭包与高阶函数一起使用就足够了。这是在运行它的scheme环境中使用的还是您正在编写的scheme解释器的一部分?这两个问题需要不同的答案。我正在学习这个方案,希望确保我的解决方案不会难看。你给我的印象是,你需要在运行时生成过程
eval
是唯一一个这样做的结构。通常,使用这个和eval对优化有很大的影响,所以如果你给我们一个如何使用这个的例子,我们可能会一起想出一个更好的解决方案。通常将lambda和闭包用于高阶函数就足够了。