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