我如何使用;cl位置“;在clisp中准确运行?
我尝试在clisp中使用cl position,但是,每当我尝试运行代码时,都会出现以下错误:我如何使用;cl位置“;在clisp中准确运行?,lisp,common-lisp,clisp,Lisp,Common Lisp,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
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 ...
do (do-this foo bar)
(do-that foo baz))
或
progn
是一个特殊的操作符。所附表单将逐个求值,并返回最后一个结果值
潜伏着更多的问题
ROBOT
和KB
是未定义的变量。如果要引入其他局部变量,可以使用let
和let*
cl position
是公共Lisp中未定义的函数。它实际上被称为位置
。在通用Lisp中,标准函数从来没有前缀cl-
。他们在Emacs Lisp中有这个前缀,它缺少函数名的名称空间,并将前缀用作一种丑陋的攻击。Common Lisp有函数名的名称空间(称为包),因此像position
这样的函数不需要名称前缀。对于名称空间,Common Lisp中的名称是cl:position
或更长的Common Lisp:position
。大多数情况下,我们可以只写位置
首先,我们需要使代码的格式和缩进更好
(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 ...
do (do-this foo bar)
(do-that foo baz))
或
progn
是一个特殊的操作符。所附表单将逐个求值,并返回最后一个结果值
潜伏着更多的问题
ROBOT
和KB
是未定义的变量。如果要引入其他局部变量,可以使用let
和let*
cl position
是公共Lisp中未定义的函数。它实际上被称为位置
。在通用Lisp中,标准函数从来没有前缀cl-
。他们在Emacs Lisp中有这个前缀,它缺少函数名的名称空间,并将前缀用作一种丑陋的攻击。Common Lisp有函数名的名称空间(称为包),因此像position
这样的函数不需要名称前缀。对于名称空间,Common Lisp中的名称是cl:position
或更长的Common Lisp:position
。大多数情况下,一个人可以只写位置