clisp中如何准确使用"cl-position"函数?
How do I use the "cl-position" function accurately in clisp?
我正在尝试在 clisp 中使用 cl-position,但是,每当我尝试 运行 代码时,我都会收到以下错误:
Prinayas-MacBook-Pro:~ pchoubey$ clisp project1.lisp
*** - SYSTEM::%EXPAND-FORM:
(PRINT (CL-POSITION "bar" '("foo" "bar" "baz") :TEST 'EQUAL)) should be
a lambda expression
为什么会发生这种情况,我怎样才能将此代码正确地 运行?作为参考,这是我的代码:
(defun answer-ynq()
(setq ROBOT '(IS_A_ROBOT ROBBIE))
(loop for x in ROBOT
do(
(print (cl-position "bar" '("foo" "bar" "baz") :test 'equal))
))
(setq KB (make-hash-table :test 'equal))
(setf (gethash '(IS_A_ROBOT ROBBIE) KB)'T)
(setf (gethash '(IS_A_PERSON BOB) KB) 'T)
(setf (gethash '(IS_CLEVER ROBBIE) KB) 'T)
(setf (gethash '(OWNS ALICE ROBBIE) KB) 'T)
)
(answer-ynq)
首先我们需要使代码的格式和缩进更好
(defun answer-ynq ()
(setq ROBOT '(IS_A_ROBOT ROBBIE))
(loop for x in ROBOT
do ((print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal))))
(setq KB (make-hash-table :test 'equal))
(setf (gethash '(IS_A_ROBOT ROBBIE) KB) T)
(setf (gethash '(IS_A_PERSON BOB) KB) T)
(setf (gethash '(IS_CLEVER ROBBIE) KB) T)
(setf (gethash '(OWNS ALICE ROBBIE) KB) T))
(answer-ynq)
实际错误:括号错误
((print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal)))
不能在这样的函数调用周围加上括号。通常括号不是可选的分组字符,但它们提供了基本的句法结构。
必须是:
(print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal))
如果在这样的 loop
表达式中需要不止一种形式,则有两个基本选项:
(loop ...
do (do-this foo bar)
(do-that foo baz))
或
(loop ...
do (progn
(do-this foo bar)
(do-that foo baz)))
progn
是一个特殊运算符。所附表格逐一求值,返回最后的结果值。
更多问题潜伏
ROBOT
和 KB
是未定义的变量。如果你想引入额外的局部变量,可以使用 let
和 let*
.
cl-position
是 Common Lisp 中的未定义函数。它实际上被称为position
。在 Common Lisp 中,标准函数从来没有前缀 cl-
。他们在 Emacs Lisp 中有这个前缀,Emacs Lisp 缺少函数名称的名称空间,并将前缀用作丑陋的 hack。 Common Lisp 有函数名称的名称空间(称为 packages),因此像 position
这样的函数不需要名称前缀。有了命名空间,Common Lisp 中的名称是 cl:position
或更长的 common-lisp:position
。大多数时候可以只写 position
.
我正在尝试在 clisp 中使用 cl-position,但是,每当我尝试 运行 代码时,我都会收到以下错误:
Prinayas-MacBook-Pro:~ pchoubey$ clisp project1.lisp
*** - SYSTEM::%EXPAND-FORM:
(PRINT (CL-POSITION "bar" '("foo" "bar" "baz") :TEST 'EQUAL)) should be
a lambda expression
为什么会发生这种情况,我怎样才能将此代码正确地 运行?作为参考,这是我的代码:
(defun answer-ynq()
(setq ROBOT '(IS_A_ROBOT ROBBIE))
(loop for x in ROBOT
do(
(print (cl-position "bar" '("foo" "bar" "baz") :test 'equal))
))
(setq KB (make-hash-table :test 'equal))
(setf (gethash '(IS_A_ROBOT ROBBIE) KB)'T)
(setf (gethash '(IS_A_PERSON BOB) KB) 'T)
(setf (gethash '(IS_CLEVER ROBBIE) KB) 'T)
(setf (gethash '(OWNS ALICE ROBBIE) KB) 'T)
)
(answer-ynq)
首先我们需要使代码的格式和缩进更好
(defun answer-ynq ()
(setq ROBOT '(IS_A_ROBOT ROBBIE))
(loop for x in ROBOT
do ((print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal))))
(setq KB (make-hash-table :test 'equal))
(setf (gethash '(IS_A_ROBOT ROBBIE) KB) T)
(setf (gethash '(IS_A_PERSON BOB) KB) T)
(setf (gethash '(IS_CLEVER ROBBIE) KB) T)
(setf (gethash '(OWNS ALICE ROBBIE) KB) T))
(answer-ynq)
实际错误:括号错误
((print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal)))
不能在这样的函数调用周围加上括号。通常括号不是可选的分组字符,但它们提供了基本的句法结构。
必须是:
(print (cl-position "bar" '("foo" "bar" "baz")
:test 'equal))
如果在这样的 loop
表达式中需要不止一种形式,则有两个基本选项:
(loop ...
do (do-this foo bar)
(do-that foo baz))
或
(loop ...
do (progn
(do-this foo bar)
(do-that foo baz)))
progn
是一个特殊运算符。所附表格逐一求值,返回最后的结果值。
更多问题潜伏
ROBOT
和 KB
是未定义的变量。如果你想引入额外的局部变量,可以使用 let
和 let*
.
cl-position
是 Common Lisp 中的未定义函数。它实际上被称为position
。在 Common Lisp 中,标准函数从来没有前缀 cl-
。他们在 Emacs Lisp 中有这个前缀,Emacs Lisp 缺少函数名称的名称空间,并将前缀用作丑陋的 hack。 Common Lisp 有函数名称的名称空间(称为 packages),因此像 position
这样的函数不需要名称前缀。有了命名空间,Common Lisp 中的名称是 cl:position
或更长的 common-lisp:position
。大多数时候可以只写 position
.