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 是一个特殊运算符。所附表格逐一求值,返回最后的结果值。

更多问题潜伏

ROBOTKB 是未定义的变量。如果你想引入额外的局部变量,可以使用 letlet*.

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.