我如何使用;cl位置“;在clisp中准确运行?

我如何使用;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

我尝试在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 ...
      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
。大多数情况下,一个人可以只写
位置