如何在Lisp中实现洗牌函数?Python转Lisp代码遇报错求助
解决你的Common Lisp洗牌函数问题
嘿,我来帮你捋一捋这个问题!首先得告诉你:你写的那段Lisp函数语法上完全没问题,大概率是调用方式不对才导致的报错😉
先看你的代码:
(defun my_shuffle (a b c d) (list b c d a))
这个函数的逻辑和你的Python版本完全一致——接收四个独立参数a、b、c、d,返回由b、c、d、a组成的新列表。比如正确调用它的方式应该是:
(my_shuffle 1 2 3 4) ; 运行后会返回 (2 3 4 1)
那为什么会报错呢?常见的原因可能是:
- 调用时没传够四个参数,或者参数格式不符合预期;
- 极少数情况下,某些Lisp环境对函数名的下划线有特殊限制?不过Common Lisp标准是允许下划线作为函数名一部分的,这个概率很低。
如果你的实际需求是接收一个列表作为输入(而不是四个单独参数),那你的Python版本可能是简化的示例,这时候可以改成用destructuring-bind来解构列表参数,代码如下:
(defun my_shuffle (lst) (destructuring-bind (a b c d) lst (list b c d a)))
调用的时候直接传一个列表就行:
(my_shuffle '(1 2 3 4)) ; 同样返回 (2 3 4 1)
总结一下:
- 要是需求和Python版完全一致(收四个单独参数),那你写的函数本身是对的,检查下调用方式;
- 要是想处理列表输入,就用上面带解构的版本。
内容的提问来源于stack exchange,提问作者Kei Minagawa
相关产品推荐
相关产品推荐

