【问题标题】:Undefined variable in function declaration while it is clearly defined [duplicate]明确定义的函数声明中未定义的变量[重复]
【发布时间】:2018-02-04 14:49:55
【问题描述】:

我正在开发一个函数,可让您测量传递函数 run-n-time 的运行时间。它还没有接近完成,因为在编写代码时,我遇到了一个奇怪的错误。请注意,我对 common lisp 很陌生。

将其输入到我的 sbcl-repl(版本:SBCL 1.3.1.debian)

(defun run-n-time (fn times argn)
  (loop for n from 0 to times
    do (apply fn (argn n))))

给我这个输出(不重要的东西被删除)

; caught STYLE-WARNING:
;   The variable ARGN is defined but never used.

; in: DEFUN RUN-N-MEASURE
;     (ARGN N)
; 
; caught STYLE-WARNING:
;   undefined function: ARGN

它指出argn 未使用并且未定义。

我不知道这里发生了什么,这是一段如此简单的代码:(

【问题讨论】:

    标签: common-lisp sbcl


    【解决方案1】:

    Common Lisp 具有独立的函数和值命名空间。

    (argn n) 形式使用argn 运算符,而不是变量。你需要在这里使用funcall:(funcall argn n)。

    【讨论】:

    • 我理解正确吗?函数体中的(argn n) 被普通lisp 视为argn 操作符,而函数定义中的(fn times argn) 被视为ARGN 符号我> 。因此,您需要做的是使用 symbol ARGN?上的 funcall 从函数命名空间中检索 function argn?
    • 哦,不,argn 是一个传递给 run-n-time 的函数,它采用迭代变量 n 来确定任意函数 fn 采用哪些参数,以实现灵活性原因。
    • 想象一下(list list) 的形式。运算符位置的list 计算为标准函数list,而操作数位置的list 只是一个变量。它们都是变量,但普通变量可以计算为符号。您可以执行(list (funciton list)),现在操作数从函数命名空间获取变量。 #'list 是语法快捷方式。 (apply #'+ '(1 2 3)) ; ==> 6。您需要执行(funcall argn n) 来调用绑定在变量命名空间中的函数。你也可以使用(apply argn (list n))
    • @Sylwester,谢谢,我不知道与函数命名空间的交互。如果您删除答案的最后一段,我会接受。
    • @Azeirah 我会让 Svante 去做 :-)
    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2011-02-07
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多