Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 函数声明中未定义的变量,但已明确定义_Common Lisp_Sbcl - Fatal编程技术网

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