区分大小写Common Lisp

Lim*_*ime 2 windows debugging common-lisp case-sensitive

我试图让sbcl区分大小写并没有成功.有谁知道问题可能是什么?它在这里这里提到这是可能的.

我在跑

(setf (readtable-case *readtable*) :invert)
(defun hi () "Hi!")
(HI)
(HI)
"Hi!"
Run Code Online (Sandbox Code Playgroud)

在repl里面如下.

"C:\Program Files\Steel Bank Common Lisp\1.2.15\sbcl.exe" --core "C:\Program Files\Steel Bank Common Lisp\1.2.15\sbcl.core"
Run Code Online (Sandbox Code Playgroud)

编辑:所以,如果你在Common Lisp中调用一个区分大小写的函数,它会恢复到原来对于程序的其他部分敏感的旧行为,我发现目前无法阻止这种情况.

; in: Hi2
;     (|Hi2|)
;
; caught style-warning:
;   undefined function: Hi2
;
; compilation unit finished
;   Undefined function:
;     Hi2
;   caught 1 STYLE-WARNING condition

debugger invoked on a UNDEFINED-FUNCTION in thread
#<THREAD "main thread" RUNNING {1002C77BE3}>:
  The function COMMON-LISP-USER::|Hi2| is undefined.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 5

Common Lisp 始终区分大小写.符号有名称,只是字符串.但是,很少有东西能让事情看起来像是不区分大小写的.要了解这些是什么,您需要了解一下系统如何读取代码.

当系统读取表单时,它必须从文本表示创建一个Lisp对象.例如,如果读者正在读取类似于的字符串(hello world),那么结果应该是两个符号的列表.这些符号的名称是什么?这就是读者有一些灵活性的地方.读者可以使用默认行为来提升从输入中读取的名称.读者得到输入"hello"和"world",然后这些内容翻译成"HELLO"和"WORLD",然后实习.正如您所发现的那样,这是由可读案件控制的.有几种不同的可能性,即:upcase,:downcase,:preserve和:invert.:保留和:反转对于互操作性代码非常方便.

函数具有区分大小写或不具有区分大小写的意义.可读案例仅影响读者将文本输入转换为符号名称的方式.听起来你想要做的就是确保readtable-case是:preserve或:在你读代码时反转.请注意,如果readtable-case为:invert,则所有小写字母名称都会上升,所有大写字母名称都会下降,其他所有内容都会被保留.我指出这一点是因为在你的例子中(defun hi()"嗨!"),文本"hi"将被提升,你定义一个函数的符号将具有名称"HI".然后,当您写(HI)时,阅读器将生成一个名为"hi"的符号列表,该符号不能是相同的符号.


到目前为止提供的代码不能像您的示例显示的那样工作,并且它看起来不像复制粘贴REPL脚本.这是我在运行您显示的代码时看到(并期望)的内容:

* (setf (readtable-case *readtable*) :invert)

:invert
* (defun hi () "hello")

hi
Run Code Online (Sandbox Code Playgroud)

(hi)有效,因为读者仍然反转并给出一个名为"HI"的符号,如预期的那样:

* (hi)

"hello"
Run Code Online (Sandbox Code Playgroud)

但是写(HI)没有,因为读者反转并给你一个名为"hi"的符号,如预期的那样:

* (HI)
; in: HI
;     (|hi|)
; 
; caught style-warning:
;   undefined function: HI
; 
; compilation unit finished
;   Undefined function:
;     HI
;   caught 1 STYLE-WARNING condition

debugger invoked on a UNDEFINED-FUNCTION in thread
#<THREAD "main thread" RUNNING {1002FDE7D3}>:
  The function COMMON-LISP-USER::|hi| is undefined.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

("undefined function")
Run Code Online (Sandbox Code Playgroud)

现在,在交互测试这一点,你需要明确是否你要停留在调试器,因为某些设置(如readtable情况下)可能会在调试器中为方便起见而改变.例如,

* (setf (readtable-case *readtable*) :invert)

:invert
* (defun hi () "hello")

hi
* (HI)
; in: HI
;     (|hi|)
; 
; caught style-warning:
;   undefined function: HI
; 
; compilation unit finished
;   Undefined function:
;     HI
;   caught 1 STYLE-WARNING condition

debugger invoked on a UNDEFINED-FUNCTION in thread
#<THREAD "main thread" RUNNING {1002FDE7D3}>:
  The function COMMON-LISP-USER::|hi| is undefined.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

("undefined function")
0] TOP
Run Code Online (Sandbox Code Playgroud)

我们进入TOP以退出调试器.你可以输入获取可用命令列表.现在我们回到顶级REPL,我们可以看到(HI)将具有相同的结果.这一次,我们也会尝试从调试器中执行(HI):

* (HI)

debugger invoked on a UNDEFINED-FUNCTION in thread
#<THREAD "main thread" RUNNING {1002FDE7D3}>:
  The function COMMON-LISP-USER::|hi| is undefined.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SYMBOL-FUNCTION |hi|)
0] (HI)                   ;; within the debugger

"hello"                   ;; "HI" must have been read as "HI", not "hi"
0] TOP
Run Code Online (Sandbox Code Playgroud)

从debuger中,(HI)工作得很好.它必须重置为某些"标准"值,以使程序员的生活更轻松.但是,在进入TOP之后,我们又回到了REPL,并且(HI)将再次失败:

* (HI)

debugger invoked on a UNDEFINED-FUNCTION in thread
#<THREAD "main thread" RUNNING {1002FDE7D3}>:
  The function COMMON-LISP-USER::|hi| is undefined.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SYMBOL-FUNCTION |hi|)
0] 
Run Code Online (Sandbox Code Playgroud)