首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lisp宏多任务

Lisp宏多任务
EN

Stack Overflow用户
提问于 2020-08-01 01:42:54
回答 1查看 81关注 0票数 1

我有一个关于lisp宏的问题。我想检查一个条件,如果它是真的,运行几个东西,而不是只运行一个。对于错误的方式也是如此。有人能帮帮忙吗??

代码语言:javascript
复制
(defmacro test (condition (&rest then) (&rest else))
  `(if ,condition (progn ,@then) (progn ,@else)))

(test (= 4 3)
      (print "YES") (print "TRUE")
      (print "NO") (print "FALSE"))
EN

回答 1

Stack Overflow用户

发布于 2020-08-01 02:44:07

测试宏的常用方法是使用macroexpand

您的测试用例缺少括号(lisp阅读器不关心空格,如换行符和缩进):

代码语言:javascript
复制
(macroexpand '(test (= 4 3)
                    (print "YES") (print "TRUE")
                    (print "NO") (print "FALSE")))
  Error while parsing arguments to DEFMACRO TEST:
    too many elements in
      ((= 4 3) (PRINT "YES") (PRINT "TRUE") (PRINT "NO") (PRINT "FALSE"))
    to satisfy lambda list
      (CONDITION (&REST THEN) (&REST ELSE)):
    exactly 3 expected, but got 5

代码语言:javascript
复制
(macroexpand '(test (= 4 3)
                    ((print "YES") (print "TRUE"))
                    ((print "NO") (print "FALSE"))))
(IF (= 4 3)
    (PROGN (PRINT "YES") (PRINT "TRUE"))
    (PROGN (PRINT "NO") (PRINT "FALSE")))

请注意,CL有cond,通常在if子句中需要多种形式时使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63196643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档