【问题标题】:Invalid specialized parameter in method lambda list方法 lambda 列表中的专用参数无效
【发布时间】:2015-06-14 03:40:46
【问题描述】:

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

这里有什么问题?

【问题讨论】:

标签: lisp common-lisp


【解决方案1】:

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

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

【讨论】:

  • let 语法也是错误的,以至于它无法运行,它应该在编译时发出错误信号。
  • @Paulo:谢谢,我没有注意到那部分。我还结合了@Vatine 的建议,即(random 2)
【解决方案2】:

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

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

您对random 的调用可能没有达到您想要的效果,HyperSpec 说“返回一个伪随机数,它是一个小于限制且与限制相同类型的非负数。”,所以@ 987654329@只能返回0。

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

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

【讨论】:

  • 答案中的 let 语法仍然是错误的。您正在定义一个用 nil 初始化的变量 ht 和一个用 2 初始化的变量 random
  • @PauloMadeira DOH!谢谢,已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多