我试图使sbcl的大小写敏感,但没有成功。有人知道问题出在哪里吗?在这里提到和这里是有可能的。
我在跑
(setf (readtable-case *readtable*) :invert)
(defun hi () "Hi!")
(HI)
(HI)
"Hi!"就像下面的爬虫一样。
"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"编辑:因此,如果在Common中调用一个对大小写敏感的函数,它会恢复到以前的行为,即在程序的其余部分中对大小写敏感,我目前还没有找到阻止这种情况的方法。
; 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.发布于 2015-09-24 19:01:51
普通的Lisp总是区分大小写的。符号有名称,只是字符串。然而,很少有事情会让事情看起来有点不敏感。要理解这些代码是什么,您需要稍微了解一下系统如何读取代码。
当系统读取表单时,它必须从文本表示创建一个Lisp对象。例如,如果读取器是从字符串(如:(hello world) )读取,则结果应该是两个符号的列表。这些符号的名字是什么?这就是读者有一些灵活性的地方。默认行为是由读取器对从输入读取的名称进行大写。读者会得到输入"hello“和"world",然后将它们大写为"HELLO”和"WORLD",然后再进行实习。正如您所发现的,这是由可读的情况控制的。有几种不同的可能性,即:大写,:小写,:保存,和:反转。保存和:反向可以方便地进行互操作性代码。
函数区分大小写或不区分大小写没有任何意义。可读的大小写只会影响读取器如何将文本输入转换为符号名。听起来,您想要做的是确保在读取代码时,可读的大小写是:保存或:倒转。请注意,如果可读的大小写是:反转,那么所有小写名称都会被大写大写,所有大写名称都会被小写,其他的都会被保留下来。我指出这一点,因为在您的示例(defun () " hi !")中,文本"HI“将被大写,定义函数的符号将有"hi”的名称。然后,当您编写(HI)时,读取器将生成一个名为"hi“的符号列表,该符号不能是同一个符号。
到目前为止,提供的代码并不像示例所显示的那样工作,它看起来也不像复制粘贴的REPL记录。下面是我在运行您展示的代码时所看到(并期望)的内容:
* (setf (readtable-case *readtable*) :invert)
:invert
* (defun hi () "hello")
hi编写(hi)是可行的,因为读者仍然会倒转并给您一个名为"HI“的符号,正如预期的那样:
* (hi)
"hello"但是编写(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")现在,在交互测试中,您确实需要弄清楚您是否被困在调试器中,因为为了方便起见,可能会在调试器中更改一些设置(如可读性大小写)。例如,
* (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我们进入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在调试器内部,(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] 发布于 2015-09-24 19:05:56
您的示例不起作用:
* (setf (readtable-case *readtable*) :invert)
:invert
* (defun hi () "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:
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] 注意,0]意味着我们在0级的调试器中,它具有正常的可读性。离开调试器,只需查看打印的指令,输入0,我们就回到了顶层侦听器--在那里,可读的大小写仍然是:invert。
如果您阅读SBCL打印的内容:(invokable by number or by possibly-abbreviated name)。然后你会看到0是[ABORT]。所以你按号码调用它。只需键入0并返回。您还可以键入abort。
在调试器上输入HELP说明.
如果您使用以下内容编译一个文件
(setf (readtable-case *readtable*) :invert)
(defun hi () "Hi!")
(HI),那么第一个表单将不会对编译时环境产生影响,因为编译器不会执行这段代码。它只是编译它。读者没有改变。加载代码时,它将被更改。请参阅EVAL-WHEN,以便在编译时执行顶级代码。
https://stackoverflow.com/questions/32768386
复制相似问题