Lisp(ECL)代码报“函数X未定义”错误原因咨询
问题分析与解决
是的,错误提示里的“未定义函数X”就是repeat函数的参数x。
核心问题:函数对象的调用方式错误
在Common Lisp中,直接写(x)是试图调用名为x的全局函数,但你传给repeat的是一个函数对象(比如#'random-card),它存储在局部变量x里,并不是全局定义的函数x。要调用存储在变量中的函数对象,必须使用funcall或apply。
修正后的repeat函数:
(defun repeat (x n) (if (zerop n) nil (cons (funcall x) (repeat x (1- n)))))
额外问题:random-card函数的两处错误
你的random-card函数还有两个逻辑错误,即使修复repeat也无法生成正确的纸牌字符串:
- char函数参数顺序颠倒:
char的正确用法是(char 字符串 索引),你写反了参数顺序,应该把字符串放在前面,索引放在后面。 - 引号阻止表达式求值:用
'(...)会将内部代码当作静态符号列表,不会执行random计算,必须用list来构建动态计算后的字符列表。
修正后的random-card函数:
(defun random-card () (coerce (list (char "SCDH" (random 4)) (char "A23456789JQK" (random 13))) 'string))
测试结果
运行修正后的代码:
(print (repeat #'random-card 3))
会输出类似("C5" "HJ" "S3")的随机纸牌列表,符合预期。
内容的提问来源于stack exchange,提问作者user21352310
相关产品推荐
相关产品推荐

