如何编写一个lisp函数,该函数的参数中有几个输出选项(我指的是输出几个可能的操作)

如何编写一个lisp函数,该函数的参数中有几个输出选项(我指的是输出几个可能的操作),lisp,common-lisp,Lisp,Common Lisp,您好,我尝试编写一个lisp函数或宏,它的参数中有几个输出选项(我指的是输出几个可能的操作) 谢谢 Patrick您可以向函数中添加类型规范。就像这样: (defun foo (bar) (declare (type (member :blah :minor) bar)) (princ bar)) 然后,如果您使用正确的值调用它,它将像预期的那样工作: CL-USER> (foo :blah) BLAH :BLAH 但是使用错误的值调用:(fo

您好,我尝试编写一个lisp函数或宏,它的参数中有几个输出选项(我指的是输出几个可能的操作)

谢谢


Patrick

您可以向函数中添加类型规范。就像这样:

(defun foo (bar)
  (declare (type (member :blah :minor)
                 bar))
  (princ bar))
然后,如果您使用正确的值调用它,它将像预期的那样工作:

CL-USER> (foo :blah)
BLAH
:BLAH
但是使用错误的值调用:
(foo:不支持)
将导致错误:

The value
  :OTHER
is not of type
  (MEMBER :MINOR :BLAH)
when binding BAR
   [Condition of type TYPE-ERROR]

Restarts:
 0: [RETRY] Retry SLIME REPL evaluation request.
 1: [*ABORT] Return to SLIME's top level.
 2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1002478003}>)
值
:其他
他不是那种人
(成员:未成年人:废话)
绑扎钢筋时
[类型错误的条件]
重新启动:
0:[重试]重试SLIME REPL评估请求。
1:[*中止]返回SLIME的顶层。
2:[中止]中止线程(#)

就问题而言,这一点非常不清楚。你能详细介绍一下你想知道的吗?好像你在描述
if
cond
。这有什么不同?这不对。根据规范:“在声明范围内执行对声明变量的任何引用期间,如果声明变量的值不是声明的类型,则结果是未定义的。”:因此,您的第二个咒语
foo
实际上具有未定义的行为。请注意,一些实现(特别是CMUCL及其衍生物)做了一些更有用的事情,但语言本身并没有说必须这样做。我不确定我是否完全理解。你的意思是信号错误是一种特定于实现的错误吗?是的:实现可以做任何事情。