我正在尝试编写一个会同时eazygnuplot:plot
多个系列的宏。理想情况下,我想写一些类似(plotlists lists)
的内容,其中lists
看起来像这样:
'(((57 91)) ((83 1) (90 8) (78 18)) ((42 19)))
也就是说,lists
是k
对列表的列表(更具体地说,这是一个平面上的点列表,在用k-means聚类之后)。我提到的宏应该扩展成类似的东西:
(eazy-gnuplot:plot (lambda ()
(dolist (p l1)
(format t "~&~A ~A" (first p) (second p)))))
(eazy-gnuplot:plot (lambda ()
(dolist (p l2)
(format t "~&~A ~A" (first p) (second p)))))
......等等。我的想法是写这样的东西:
(defmacro plotlists (lists)
`(progn ,@(mapcar #'(lambda (ll)
'(eazy-gnuplot:plot
(lambda ()
(dolist (p ll)
(format t "~&~A ~A" (first p) (second p))))))
lists)))
这个宏由函数scatter
调用,如下所示:
(defun scatter (lists)
(eazy-gnuplot:with-plots (*standard-output* :debug t)
(eazy-gnuplot:gp-setup :terminal '(:qt))
(plotlists lists)
(format t "~&pause mouse button1;~%")))
然而,在SBCL上编译函数会产生一些警告和错误("变量LISTS已定义但从未使用过 - 如何??&#34 ;;和"值LISTS不是类型LIST&#34)。此外,根据编译器,由于某种原因,"~&pause mouse button1;~%"
部分是"无法访问的代码"并在编译时删除。怎么样?
我对Lisp知之甚少,但这对我来说非常令人费解。有人对此有任何想法吗?
答案 0 :(得分:5)
所以,显然我接近这完全错了。没有必要使用宏,因为通过在表达式上运行int Plus(){
int a = 0, b = 0;
cin >> a;
cout << "\b + ";
cin >> b;
cout<<" = "<<a + b;
return a+b;}
可以明显看出这一点。 MACROEXPAND-1
的值不是LISTS
类型,因为它只是LIST
,这是宏扩展时唯一可用的内容。我只是将宏替换为另一个SYMBOL
:
DOLIST