方法 lambda 列表中的专用参数无效

Invalid specialized parameter in method lambda list

我正在尝试用 Common Lisp 编写一个简单的掷硬币程序。这是我的代码

(defun yn
 (let ht (random 1)
  (if (eq ht 1)
   (princ heads)
   (princ tails))
 )
)

看起来很简单,但我一直收到错误:

"Invalid specialized parameter in method lambda list (LET HT (RANDOM 1) (IF (EQ HT 1) (PRINC HEADS) (PRINC TAILS))): (IF (EQ HT 1) (PRINC HEADS) (PRINC TAILS))"
      )

这里可能有什么问题?

对于没有参数的defun,应该有一个空的参数列表,如下所示:

(defun yn ()
  (let ((ht (random 2)))
    (if (eq ht 1)
        (princ heads)
        (princ tails))))

您的 defun 格式错误(缺少空参数列表)。 您的 let 格式错误(一般结构为 (let (<bind-spec>...) <body>),其中绑定是符号(最初绑定到 nil)或 (<symbol> <value>) 列表。

headstails 似乎都没有绑定,不清楚你指的是文字符号还是使用动态范围的变量。

你对 random 的调用可能没有达到你想要的效果,HyperSpec 说 "Returns a pseudo-random number that is a non-negative number less than limit and of the same type as limit. ",所以 (random 1) 只能 return 0.

下面是一个清理过的版本,它解决了所有这些问题,假设您已经打印了文字符号 headstails

(defun yn ()
  (let ((ht (random 2)))
    (if (eq ht 1)
      (princ 'heads)
      (princ 'tails)))