我是LISP编程的初学者,我不确定如何使用tagbody从键盘读取数字,直到我达到负数。我试图在网上找到可用的资源,但到目前为止我没有成功。
非常感谢任何帮助!
答案 0 :(得分:8)
你不。 tagbody
是一个非常低级别的设施。
(loop for num = (read) while (plusp num) collect num)
PS。编译器可能会将我的代码宏扩展为tagbody
,类似于另一个答案中的表单。在某种程度上,tagbody
是Lisp的“汇编”: - )
答案 1 :(得分:3)
接近TAGBODY
及其朋友PROG
的好方法是将您的算法视为有限状态机。您的函数尝试实现以下内容:
您可以编写以下内容来实现状态机:
(PROG* (N (E (CONS NIL NIL)) (Q (CONS E E)))
READ-NUMBER
(SETQ N (READ))
(IF (MINUSP N)
(GO FINISH)
(GO COLLECT))
COLLECT
(RPLACD Q (CDR (RPLACD (CDR Q) (CONS N NIL))))
(GO READ-NUMBER)
FINISH
(RETURN (CDAR Q)))
我提升了所有符号并使用了CAR / CDAR / ...因为像TAGBODY / PROG一样,这属于几十年前不再流行的编程风格。
大量有用的状态机已经被LOOP
或其他迭代器抽象掉了。话虽如此,TAGBODY
仍然可用,并且可能在极少数情况下有用,隐藏在宏后面。
digraph abc {
rankdir=LR
nodesep=1
R[label="READ NUMBER"]
C[label="COLLECT"]
F[label="FINISH", penwidth=2]
I[style=invis, width=0]
I -> R [penwidth=0, arrowhead="vee"]
R -> C [label="N ≥ 0"]
C -> R [label="TRUE"]
R -> F [label="N < 0"]
}