宏:值不是LIST

时间:2015-10-15 02:39:37

标签: macros lisp common-lisp sbcl

我正在尝试编写一个会同时eazygnuplot:plot多个系列的宏。理想情况下,我想写一些类似(plotlists lists)的内容,其中lists看起来像这样:

'(((57 91)) ((83 1) (90 8) (78 18)) ((42 19)))

也就是说,listsk对列表的列表(更具体地说,这是一个平面上的点列表,在用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知之甚少,但这对我来说非常令人费解。有人对此有任何想法吗?

1 个答案:

答案 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