首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大小写敏感性通用Lisp

大小写敏感性通用Lisp
EN

Stack Overflow用户
提问于 2015-09-24 18:25:42
回答 2查看 425关注 0票数 3

我试图使sbcl的大小写敏感,但没有成功。有人知道问题出在哪里吗?在这里提到这里是有可能的。

我在跑

代码语言:javascript
复制
(setf (readtable-case *readtable*) :invert)
(defun hi () "Hi!")
(HI)
(HI)
"Hi!"

就像下面的爬虫一样。

代码语言:javascript
复制
"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中调用一个对大小写敏感的函数,它会恢复到以前的行为,即在程序的其余部分中对大小写敏感,我目前还没有找到阻止这种情况的方法。

代码语言:javascript
复制
; 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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-24 19:01:51

普通的Lisp总是区分大小写的。符号有名称,只是字符串。然而,很少有事情会让事情看起来有点不敏感。要理解这些代码是什么,您需要稍微了解一下系统如何读取代码。

当系统读取表单时,它必须从文本表示创建一个Lisp对象。例如,如果读取器是从字符串(如:(hello world) )读取,则结果应该是两个符号的列表。这些符号的名字是什么?这就是读者有一些灵活性的地方。默认行为是由读取器对从输入读取的名称进行大写。读者会得到输入"hello“和"world",然后将它们大写为"HELLO”和"WORLD",然后再进行实习。正如您所发现的,这是由可读的情况控制的。有几种不同的可能性,即:大写,:小写,:保存,和:反转。保存和:反向可以方便地进行互操作性代码。

函数区分大小写或不区分大小写没有任何意义。可读的大小写只会影响读取器如何将文本输入转换为符号名。听起来,您想要做的是确保在读取代码时,可读的大小写是:保存或:倒转。请注意,如果可读的大小写是:反转,那么所有小写名称都会被大写大写,所有大写名称都会被小写,其他的都会被保留下来。我指出这一点,因为在您的示例(defun () " hi !")中,文本"HI“将被大写,定义函数的符号将有"hi”的名称。然后,当您编写(HI)时,读取器将生成一个名为"hi“的符号列表,该符号不能是同一个符号。

到目前为止,提供的代码并不像示例所显示的那样工作,它看起来也不像复制粘贴的REPL记录。下面是我在运行您展示的代码时所看到(并期望)的内容:

代码语言:javascript
复制
* (setf (readtable-case *readtable*) :invert)

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

hi

编写(hi)是可行的,因为读者仍然会倒转并给您一个名为"HI“的符号,正如预期的那样:

代码语言:javascript
复制
* (hi)

"hello"

但是编写(HI)并不是这样,因为读者会倒转并给出一个名为"hi“的符号,就像预期的那样:

代码语言:javascript
复制
* (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")

现在,在交互测试中,您确实需要弄清楚您是否被困在调试器中,因为为了方便起见,可能会在调试器中更改一些设置(如可读性大小写)。例如,

代码语言:javascript
复制
* (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)

代码语言:javascript
复制
* (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)将再次失败:

代码语言:javascript
复制
* (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] 
票数 6
EN

Stack Overflow用户

发布于 2015-09-24 19:05:56

您的示例不起作用:

代码语言:javascript
复制
* (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说明.

如果您使用以下内容编译一个文件

代码语言:javascript
复制
(setf (readtable-case *readtable*) :invert)
(defun hi () "Hi!")
(HI)

,那么第一个表单将不会对编译时环境产生影响,因为编译器不会执行这段代码。它只是编译它。读者没有改变。加载代码时,它将被更改。请参阅EVAL-WHEN,以便在编译时执行顶级代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32768386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档