# 符号的 LISP 含义

标签 lisp common-lisp

在我的 Lisp 代码中,我有函数 (nfa-regex-compile),它创建一个包含初始状态、转换和最终状态的 cons 列表(表示自动机的节点)从作为参数给出的正则表达式开始。

在这种情况下,我将一个序列作为表达式,但我不明白为什么如果我给出两个以上的符号,函数会生成 (# #) 而不是继续生成新状态。

CL-USER 39 : 3 > (nfa-regex-compile '(seq a))

((INITIAL 0) ((DELTA 0 A 1) (FINAL 1)))


CL-USER 40 : 3 > (nfa-regex-compile '(seq a b))

((INITIAL 0) ((DELTA 0 A 1) ((DELTA 1 B 2) (FINAL 2))))


CL-USER 41 : 3 > (nfa-regex-compile '(seq a b c)) 

((INITIAL 0) ((DELTA 0 A 1) ((DELTA 1 B 2) (# #))))


CL-USER 42 : 3 > (nfa-regex-compile '(seq a b c d e f))

((INITIAL 0) ((DELTA 0 A 1) ((DELTA 1 B 2) (# #))))

例如,如果我有一个序列 abc,自动机应该是:

(INITIAL 0) (DELTA 0 A 1) (DELTA 1 B 2) (DELTA 2 C 3) (FINAL C)

Automaton for the regular expression abc

最佳答案

打印时,标准变量*print-level*控制打印机下降到嵌套结构的深度。如果结构深度超过该水平,打印机将停止并打印一个空的 # 而不是任何其他结构。

例如:

* (defvar *structure*
    '(:level-1 :level-1
      (:level-2 :level-2 :level-2)
      (:level-2 :level-2 (:level-3 :level-3
                          (:level-4) :level-3))))

* (dotimes (i 5)
    (let ((*print-level* i))
      (print *structure*)))

# 
(:LEVEL-1 :LEVEL-1 # #) 
(:LEVEL-1 :LEVEL-1 (:LEVEL-2 :LEVEL-2 :LEVEL-2) (:LEVEL-2 :LEVEL-2 #)) 
(:LEVEL-1 :LEVEL-1 (:LEVEL-2 :LEVEL-2 :LEVEL-2)
 (:LEVEL-2 :LEVEL-2 (:LEVEL-3 :LEVEL-3 # :LEVEL-3))) 
(:LEVEL-1 :LEVEL-1 (:LEVEL-2 :LEVEL-2 :LEVEL-2)
 (:LEVEL-2 :LEVEL-2 (:LEVEL-3 :LEVEL-3 (:LEVEL-4) :LEVEL-3)))

实际结构永远不会改变,只有它的打印表示。

此变量有时会在调试器中重新启动以避免打印严重嵌套的结构。有关详细信息,请参阅您的实现文档。

关于# 符号的 LISP 含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45150589/

相关文章:

lisp - Common Lisp : How to check set equality, 忽略顺序?

lisp - 如何从此文本中删除括号

lisp - apply & funcall - 不同的结果

lisp - 在 vim 中为 Common Lisp 自定义自动格式化/自动缩进的最佳方法

f# - F# 中的非类型化/类型化代码引用与宏卫生之间是否存在关系?

scheme - R5RS方案中如何 'display'多个参数

Lisp:原子和字符串

clojure - 为什么当我单独评估 common-lisp 函数时它们没有绑定(bind)

mysql - 如何在clsql中特殊mysql sock路径?

user-interface - sbcl 调试 cl-gtk2-gk 如果后端线程挂起