我正在尝试用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))"
)
这里可能有什么问题?
答案 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>)
列表。
heads
和tails
似乎都是未绑定的,如果您指的是文字符号或使用动态范围的变量,则不清楚。
您对random
的呼叫可能无法满足您的需求,HyperSpec会说&#34;返回一个伪随机数,该数字是一个小于极限的非负数且属于同一类型作为限制。 &#34;,所以(random 1)
只能返回0。
以下是一个清理版本,可以解决所有这些问题,假设您在打印了文字符号heads
和tails
之后。
(defun yn ()
(let ((ht (random 2)))
(if (eq ht 1)
(princ 'heads)
(princ 'tails)))