【问题标题】:How do I use the "cl-position" function accurately in clisp?如何在 clisp 中准确使用“cl-position”功能?
【发布时间】:2020-03-20 02:15:15
【问题描述】:

我正在尝试在 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)

【问题讨论】:

    标签: lisp common-lisp clisp


    【解决方案1】:

    首先我们需要让代码更好地格式化和缩进

    (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 中有这个前缀,它缺少函数名的命名空间,并且将前缀用作丑陋的 hack。 Common Lisp 具有用于函数名称的命名空间(称为 packages),因此像 position 这样的函数不需要名称前缀。使用命名空间,Common Lisp 中的名称是cl:position 或更长的common-lisp:position。大多数时候可以写position

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多