Lisp 使用父函数中的实体

Lisp 使用父函数中的实体,lisp,Lisp,通常很明显,在父函数中调用的任何函数都可以使用父函数的实体。 如果我有 (defun fun1(x)(let ((y nil))(fun2))) (defun fun2 () (print y))) 然后(fun1 2)抱怨y。如何将父函数中的实体使用到子函数中,比如fun2,使其能够访问f1的let作用域的实体。您的描述和代码确实是错误的,但我将根据我的理解回答您想要做什么 要执行此操作,您需要将变量声明为特殊: (defun parent-fun (x) (let ((y nil))

通常很明显,在父函数中调用的任何函数都可以使用父函数的实体。 如果我有

(defun fun1(x)(let ((y nil))(fun2)))

(defun fun2 () (print y)))

然后(fun1 2)抱怨y。如何将父函数中的实体使用到子函数中,比如fun2,使其能够访问f1的let作用域的实体。

您的描述和代码确实是错误的,但我将根据我的理解回答您想要做什么

要执行此操作,您需要
将变量声明为
特殊

(defun parent-fun (x)
  (let ((y nil))
    (declare (special y))
    (child-fun x)))

(defun child-fun (x)
  (declare (special y)) ;; Without this declatation it'll work
  `(,x ,y))             ;; but you'll get a warning


CL-USER> (parent-fun '(a b c))
((A B C) NIL)

在您的代码中,不可能从
fun1
fun1
访问
Y
,因为您将
Y
作为参数传递给
fun2
。您未能正确缩进/格式化代码。我是为你做的。我不知道什么是“父函数”,你的例子中的父函数是什么,以及为什么使用所谓的“父函数”中的某些东西是“显而易见的”。在您的示例中,fun2没有x可用的作用域。
fun1('(a b c))
在Lisp中无效。你确定这是一个口齿不清的问题吗?很抱歉我弄错了,没有检查两次。我希望现在它更清楚了。@RainerJoswig:我使用了一个用lisp编写的工具,我把语法搞混了。对不起,我的错。@Rorschach,那么你可能应该接受这个答案。