如何在Lisp中生成笛卡尔积?自定义生成器函数调用报错求助
解决笛卡尔积生成器的参数错误问题
首先,咱们先拆解你遇到的错误原因:你定义的cartesian-product-generator函数需要两个参数——第一个是用于处理元素的回调函数,第二个才是输入列表,但你调用的时候只传了列表'(A B C),少了回调函数这个必填参数,这就直接触发了Too few arguments的报错。
咱们一步步来修正和优化:
1. 明确函数的正确调用逻辑
先看你原有的函数定义:
(defun cartesian-product-generator (CALLBACK LIST) (LOOP FOR X IN LIST NCONC (LOOP FOR Y IN LIST DO(FUNCALL CALLBACK (LIST X Y)))))
这里的CALLBACK是你要用来逐个处理笛卡尔积元素的函数(比如打印、存储等),必须作为第一个参数传入。
2. 正确的调用示例
比如你想把每个笛卡尔积元素打印出来,可以先定义一个简单的回调函数,再调用生成器:
;; 定义回调函数:打印传入的元素 (defun print-cartesian-element (elem) (format t "~a~%" elem)) ;; 正确调用生成器:传入回调函数 + 输入列表 (cartesian-product-generator #'print-cartesian-element '(A B C))
执行后会逐个输出笛卡尔积元素:
(A A) (A B) (A C) (B A) (B B) (B C) (C A) (C B) (C C)
另外还有个小优化:你原函数里的NCONC其实没有实际作用——内层循环用了DO,不会返回有效列表,NCONC拼接空列表等于没做。可以简化函数,功能完全不变:
(defun cartesian-product-generator (CALLBACK LIST) (LOOP FOR X IN LIST DO (LOOP FOR Y IN LIST DO (FUNCALL CALLBACK (LIST X Y)))))
3. 用匿名函数简化调用
如果不想单独定义回调函数,也可以直接用lambda匿名函数传入:
(cartesian-product-generator (lambda (elem) (format t "正在处理元素:~a~%" elem)) '(A B C))
执行后会输出:
正在处理元素:(A A) 正在处理元素:(A B) 正在处理元素:(A C) 正在处理元素:(B A) 正在处理元素:(B B) 正在处理元素:(B C) 正在处理元素:(C A) 正在处理元素:(C B) 正在处理元素:(C C)
内容的提问来源于stack exchange,提问作者Michelle
相关产品推荐
相关产品推荐

