Common lisp 函数声明中未定义的变量,但已明确定义
我正在开发一个函数,它可以让您测量所传递函数的运行时间Common lisp 函数声明中未定义的变量,但已明确定义,common-lisp,sbcl,Common Lisp,Sbcl,我正在开发一个函数,它可以让您测量所传递函数的运行时间run-n-time。它还没有接近完成,因为在编写代码时,我遇到了一个奇怪的错误。请注意,我对CommonLisp还很陌生 将其输入我的sbcl repl(版本:sbcl 1.3.1.debian) 给我这个输出(不重要的东西被删除) 它表示argn未使用且未定义 我不知道这里发生了什么,这是一段非常简单的代码:(Common Lisp有单独的函数和值名称空间 表单(argn)使用的是argn运算符,而不是变量。您需要在此处使用funcall
run-n-time
。它还没有接近完成,因为在编写代码时,我遇到了一个奇怪的错误。请注意,我对CommonLisp还很陌生
将其输入我的sbcl repl(版本:sbcl 1.3.1.debian
)
给我这个输出(不重要的东西被删除)
它表示argn
未使用且未定义
我不知道这里发生了什么,这是一段非常简单的代码:(Common Lisp有单独的函数和值名称空间
表单
(argn)
使用的是argn
运算符,而不是变量。您需要在此处使用funcall
:(funcall argn)
Common Lisp有单独的函数和值命名空间
表单
(argn)
使用的是argn
运算符,而不是变量。您需要在此处使用funcall
:(funcall argn)我是否正确理解它?函数体中的(argn)
被公共lisp视为argn
运算符,而(fn乘以argn)
在函数定义中被视为符号ARGN
。因此,您需要做的是通过在符号ARGN
上使用funcall
从函数名称空间中检索函数ARGN
?哦,不,ARGN
是一个传递给run-n-time的函数,它使用迭代变量>n
确定任意函数fn
采用的参数,出于灵活性考虑。想象一下的形式(列表)运算符位置的列表
计算为标准函数列表
,而操作数位置的列表
只是一个变量。它们都是变量,但普通变量可以计算为符号。您可以执行(列表(函数列表))
现在,操作数从函数名称空间调用变量。#list
是语法快捷方式。(apply#'+'(1 2 3));==>6
。您需要执行(funcall argn)
来调用变量名称空间中绑定的函数。您还可以使用(apply argn(list n))
@Sylvester,谢谢,我不知道与函数名称空间的交互作用。如果你删除答案的最后一段,我会接受它。@Azeirah我会让Svante去做:-)我理解正确吗?common lisp将函数体中的(argn)
视为argn
运算符,而函数定义中的(fn乘以argn)
视为argn
符号。因此,您需要做的是使用符号argn
上的funcall
从函数名称空间中检索函数argn
,哦,不,argn
是一个传递给run-n-time的函数,它使用迭代变量n
来确定任意函数fn
采用什么参数,这是出于灵活性的原因。想象一下表单(列表)
<运算符位置的代码>列表
计算为标准函数列表
,而操作数位置的列表
只是一个变量。它们都是变量,但普通变量可以计算为符号。您可以执行(list(function list))
,现在操作数将变量从函数名称空间中移除<代码>#'列表
是语法快捷方式<代码>(应用#'+'(1 2 3));=>6
。您需要执行(funcall argn)
来调用变量命名空间中绑定的函数。您还可以使用(apply argn(list n))
@sylvester,谢谢,我不知道与函数名称空间的交互。如果你删除你答案的最后一段,我会接受。@Azeirah我会让Svante去做:-)
(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