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

时间:2015-06-14 03:40:46

标签: lisp common-lisp

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

这里可能有什么问题?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

headstails似乎都是未绑定的,如果您指的是文字符号或使用动态范围的变量,则不清楚。

您对random的呼叫可能无法满足您的需求,HyperSpec会说&#34;返回一个伪随机数,该数字是一个小于极限的非负数且属于同一类型作为限制。 &#34;,所以(random 1)只能返回0。

以下是一个清理版本,可以解决所有这些问题,假设您在打印了文字符号headstails之后。

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