这是从scheme中的两个列表创建lambda的正确方法吗?
我正在尝试从参数创建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作为第一个元素。此语法稍
(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和闭包用于高阶函数就足够了。