首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从s表达式创建lambda

从s表达式创建lambda
EN

Stack Overflow用户
提问于 2008-10-19 02:04:55
回答 5查看 988关注 0票数 2

我有一个s表达式绑定到Common Lisp中的一个变量:

代码语言:javascript
运行
复制
(defvar x '(+ a 2))

现在我想创建一个函数,当调用它时,在定义它的作用域中计算表达式的值。我试过了:

代码语言:javascript
运行
复制
(let ((a 4))
  (lambda () (eval x)))

代码语言:javascript
运行
复制
(let ((a 4))
  (eval `(lambda () ,x)))

但这两者都产生了一个问题: EVAL将在顶层计算代码,因此我无法捕获表达式中包含的变量。请注意,我不能将LET表单放入EVAL中。有什么解决方案吗?

编辑:那么如果EVAL问题没有解决方案,还能怎么做呢?

编辑:有一个关于我到底想要做什么的问题。我正在写一个编译器。我希望接受在定义表达式的词法环境中闭合变量的s表达式。把它写成宏可能确实更好。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-05 13:15:42

您需要创建具有必要绑定的代码。用字母括起你的代码,并绑定你想要在你的代码中可用的每个变量:

代码语言:javascript
运行
复制
(defvar *x* '(+ a 2))

(let ((a 4))
  (eval `(let ((a ,a))
           ,*x*)))
票数 5
EN

Stack Overflow用户

发布于 2008-10-19 02:54:18

CLISP实现了一个扩展来评估词法环境中的形式。从它是一个扩展的事实来看,我怀疑你不能以一种符合标准的方式做到这一点。

代码语言:javascript
运行
复制
(ext:eval-env x (ext:the-environment))

参见http://clisp.cons.org/impnotes.html#eval-environ

票数 3
EN

Stack Overflow用户

发布于 2008-10-20 19:30:38

你想解决的实际问题是什么?最有可能的是,您试图以错误的方式处理它。词法绑定是针对在其作用域内以词法出现的内容,而不是针对从外部获得的随机内容。

也许你想要一个动态闭包?这样的东西在Common Lisp中是不存在的,尽管在一些Lisp方言中是存在的(就我所知,像Pico Lisp )。

请注意,您可以执行以下操作,这与此类似:

代码语言:javascript
运行
复制
(defvar *a*)
(defvar *x* '(+ *a* 2))  ;'

(let ((a 10))
  ;; ...
  (let ((*a* a))
    (eval *x*)))

不过,我建议你认真考虑一下你是否真的想这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/215883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档