Lisp:TAGBODY问题

Lisp:TAGBODY问题,lisp,common-lisp,Lisp,Common Lisp,我是LISP编程的初学者,我不确定如何使用tagbody从键盘读取数字,直到达到负数为止。我试图在网上找到可用的资源,但到目前为止我没有成功 任何帮助都将不胜感激 你没有。是一个非常低级的设施 使用或替代: 另外,编译器可能会将我的代码宏扩展为一个tagbody,类似于另一个答案中的形式。在某种程度上,tagbody是Lisp:-)的“汇编”您没有。是一个非常低级的设施 使用或替代: 另外,编译器可能会将我的代码宏扩展为一个tagbody,类似于另一个答案中的形式。在某种程度上, Tab形体是L

我是LISP编程的初学者,我不确定如何使用tagbody从键盘读取数字,直到达到负数为止。我试图在网上找到可用的资源,但到目前为止我没有成功

任何帮助都将不胜感激

你没有。是一个非常低级的设施

使用或替代:

另外,编译器可能会将我的代码宏扩展为一个
tagbody
,类似于另一个答案中的形式。在某种程度上,
tagbody
是Lisp:-)的“汇编”

您没有。是一个非常低级的设施

使用或替代:

另外,编译器可能会将我的代码宏扩展为一个
tagbody
,类似于另一个答案中的形式。在某种程度上,<代码> Tab形体是LISP的“汇编”:-/P>< P>一个很好的解决方法,它的朋友是把你的算法看作是一个有限状态机。您的函数尝试实现以下功能:

您可以编写以下代码来实现状态机:

(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)))
我更新了所有符号和二手车/CDAR/。。。因为就像TAGBODY/PROG一样,它属于一种几十年前已经过时的编程风格。 大量有用的状态机已经被或其他迭代器抽象掉了。这就是说,
TAGBODY
仍然可用,在极少数情况下可能有用,隐藏在宏后面

Graphviz源
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"]

}
有向图{ rankdir=LR nodesep=1 R[label=“读取编号”] C[label=“COLLECT”] F[label=“FINISH”,笔宽=2] I[style=invi,width=0] I->R[penwidth=0,arrowhead=“vee”] R->C[label=“N≥ 0"] C->R[label=“TRUE”] R->F[label=“N<0”] } > P>一个很好的解决方法,它的朋友是把你的算法看作是一个有限状态机。您的函数尝试实现以下功能:

您可以编写以下代码来实现状态机:

(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)))
我更新了所有符号和二手车/CDAR/。。。因为就像TAGBODY/PROG一样,它属于一种几十年前已经过时的编程风格。 大量有用的状态机已经被或其他迭代器抽象掉了。这就是说,
TAGBODY
仍然可用,在极少数情况下可能有用,隐藏在宏后面

Graphviz源
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"]

}
有向图{ rankdir=LR nodesep=1 R[label=“读取编号”] C[label=“COLLECT”] F[label=“FINISH”,笔宽=2] I[style=invi,width=0] I->R[penwidth=0,arrowhead=“vee”] R->C[label=“N≥ 0"] C->R[label=“TRUE”] R->F[label=“N<0”] }
所有这些
setf
s都太花哨了!如果已经进入内存通道,则使用
setq
rplacd
@谢谢,我改了。支票类型也很现代。@RainerJoswig谢谢。所有这些
setf
s都太花哨了!如果已经进入内存通道,则使用
setq
rplacd
@任性谢谢,我改了。支票类型也很现代。@RainerJoswig谢谢。
tagbody
不会从键盘上读;这是一个控制流构造。您可以使用它创建带有标签的语句体。在这个主体中,您可以使用
go
跳转到带标签的语句
tagbody
可用于创建循环,循环重复执行某些操作,如读取输入。需要调试帮助的StackOverflow问题应包括问题本身中的非工作代码、输入和所需输出,或所需行为的描述。
tagbody
不从键盘读取;这是一个控制流构造。您可以使用它创建带有标签的语句体。在这个主体中,您可以使用
go
跳转到带标签的语句
tagbody
可用于创建循环,循环重复执行某些操作,如读取输入。需要调试帮助的StackOverflow问题应包括问题本身中的非工作代码、输入和所需输出,或所需行为的描述。