lispbox 使用简介2

这里我开始使用缓冲区(buffer)这个名词,缓冲区是 Emacs 编辑器的一个概念,文本编辑窗口是一个缓冲区,REPL 是一个缓冲区,消息事件也是一个缓冲区,不同的缓冲区可以来回切换,缓冲区的屏幕布局也可以通过快捷键来设置:
C-x 1 当前缓冲区占据整个 Emacs 窗口,其他缓冲区全部放到后台;
C-x 0 关闭当前缓冲区
C-x 2 在当前缓冲区上方新打开一个缓冲区
C-x 3 在当前缓冲区右方新打开一个缓冲区
最后再介绍一个超级有用的快捷键:查看标准函数、标准宏源代码,我们知道 Common Lisp 的很多实现都是开源的,包括我们推荐使用的 CCL,这就意味着我们可以查看其源代码,既便于深入理解,也便于学习模仿,比如对于自定义函数的宏 defun ,我们想查看它的源代码,想了解它的具体实现细节,可以把光标放在 defun 上,然后按 M-.
M-.     同时按 Alt 键 和 点键 . ,查看当前光标所在位置的函数的源代码大家可能注意到我介绍了不少的 Emacs 快捷命令,这正是我想要大力推荐的,就我的使用经验而言,这些快捷操作能够极大地提升 Emacs 开发环境下编程、调试的效率,所以希望初学者能熟悉这些快捷操作,其实多用几次就熟悉了,慢慢就习惯了,不知不觉工作效率就提高了,可以早点完成工作了,可以早点下班回家了,于是有了更多的自由时间,可以多看看书、多运动运动、多陪陪家人、多发展下个人的兴趣爱好……然后你的整个人生就改变了 :)美好的未来真值得期待啊,现在让我们言归正传,继续讨论如何加载 Lisp 源程序,有多种方式可以加载,我们先介绍在 REPL 界面的方式:
CL-USER> (load "~/ecode/markdown-doc/hi.lisp")
#P"/Users/admin/ECode/Markdown-doc/hi.lisp"
CL-USER> (hi)
ä½ å¥½ï¼Œä¸–ç•Œï¼
NIL
CL-USER> 
 [说明  #P"/Users/admin/ECode/Markdown-doc/hi.lisp" 这种返回形式表示返回结果是一个路径对象]悲剧了,精心编写的问候语成了一堆乱码,是什么原因?该怎么办呢?原因也简单,所有的文件操作函数(比如 load open等)默认的字符编码格式类型都是 :latin-1 ,这种编解码类型对应英文字符,遇到中文内容自然就乱码了。
没错,你没看错,我也没写错,这个类型名称就是以冒号打头的个符号,这种类型的符号在 Lisp 中被称为关键字 keyword ,对这种类型的符号求值会得到冒号后面的符号名称,从现在开始初学者要逐步适应 Lisp 对符号的使用习惯。而我们的中文使用的编码恰恰不是这个,而是 :utf-8 ,那么就需要手工指定了,如下:
CL-USER> (load "~/ecode/markdown-doc/hi.lisp" :external-
format :utf-8)
#P"/Users/admin/ECode/Markdown-doc/hi.lisp"
CL-USER> (hi)
你好,世界!
NIL
CL-USER>
好了,问题解决了,可是有些朋友觉得很麻烦,每次加载文件都得输入一长串额外的参数,这里介绍一个稍微简单点的办法,可以通过修改系统的全局变量 *default-external-format* 来把默认的文件格式改成我们需要的 :utf-8 ,先查看一下当前的值,如下:
CL-USER> *default-external-format*
:UNIX
CL-USER>
用 setq 函数修改,第一个参数是要修改的全局变量,第二个参数是希望修改成的值,修改然后查看:
CL-USER> (setq *default-external-format* :utf-8)
:UTF-8
CL-USER> *default-external-format*
:UTF-8
CL-USER>
说明:全局变量 *default-external-format* 在 CCL 和 CLisp 中可以用,但是在 SBCL 中不支持,因此如果你的编程环境是 SBCL 的话,那么想要支持中文就需要每次手动指定编码格式了---SBCL 是否有类似的全局变量?我不太清楚,知道的朋友可以指点一下。之所以介绍使用 setq 函数,是因为这个函数在 Common Lisp 和 Emacs Lisp 中都可以使用,都可以用于赋值,也就是说你可以在 Emacs 的配置文件中使用 setq 这个函数来修改一些全局配置量,而且 setq 在 Common Lisp 中更是一个特殊操作符,据说现代风格一般使用宏 setf 来实现赋值功能,setf 封装了对 setq 的调用。
更详细的使用方法可以查询 HyperSpec 。
好了,再试一下,看看效果:
CL-USER> (load "~/ecode/markdown-doc/hi.lisp")
#P"/Users/admin/ECode/Markdown-doc/hi.lisp"
CL-USER> (hi)
ä½ å¥½ï¼Œä¸–ç•Œï¼
NIL
CL-USER> (setq *default-external-format* :utf-8)
:UTF-8
CL-USER> (load "~/ecode/markdown-doc/hi.lisp")
#P"/Users/admin/ECode/Markdown-doc/hi.lisp"
CL-USER> (hi)
你好,世界!
NIL
CL-USER>
修改生效!击掌庆祝一下!
赋值语句 setq 的各种例子:
CL-USER> (setq a (print "hello world!"))
 
"hello world!"
"hello world!"
CL-USER> (setq a '(hello world!))
(HELLO WORLD!)
CL-USER> (setq b (print "hello world!"))
 
"hello world!"
"hello world!"
CL-USER> b
"hello world!"
CL-USER> (setq c '())
NIL
CL-USER> c
NIL
 
CL-USER> (setq c ())
NIL
CL-USER> c
NIL
CL-USER> (setq c ( ))
NIL
CL-USER> c
NIL
CL-USER> (setq c (    ))
NIL
CL-USER> c
NIL
CL-USER> (setq c (  nil  ))
; Evaluation aborted on #<TYPE-ERROR #x302000CF368D>.
CL-USER> (setq c (nil))
; Evaluation aborted on #<TYPE-ERROR #x302000BF2BBD>.
CL-USER> (setq c '(nil))
(NIL)
CL-USER> c
(NIL)
CL-USER> (setq c (nil))
; Evaluation aborted on #<TYPE-ERROR #x302000C812CD>.
CL-USER> 
 
【补充说明】事实上字符编解码会涉及一系列知识点,我这里只是大致提一下,只简单介绍部分用法,不做详细讲解,感兴趣的朋友可以自己搜索相关资料,好好看看,把这些弄懂了基本上就清楚在各种不同场景下程序支持中文的机制了。
6、补充阅读:让程序支持中文符号
中文符号使用场景写到这里,就自然而然地涉及到了在程序中使用中文符号的话题,就我的理解,在程序中对中文符号的使用可分为如下场景:中文符号作为字符串来使用
这个是最常见的一种使用方式,也是最容易实现的一种方式,我们前面的问好程序 hi 就是把中文当字符串使用的中文符号作为自定义变量名称、自定义函数名称、自定义宏名称来使用这个需要对开发环境做一些配置,因为你的 Lisp 的读取器也好,求值器也好,都需要专门指定编解码来识别双字节的中文,而且使用 Slime 这种交互接口,还涉及一个客户端和服务端通信的编解码,我们接下来也主要讲解在这种方式下使用中文符号需要进行的配置工作中文符号作为语法关键字来使用这种场景下连 “if” 这样的关键字都可以写成中文 “如果” 了,这样使用中文符号的结果是:源程序完全由中文、数字和其他符号组成,也就是说你可以自由地使用中文进行编程,需要编译器识别这些关键字,因此这种使用方式需要做更进一步的配置,幸运的是 Lisp 可以通过一些简单的设置完美地支持。我正在投入的一个开源项目:【开源母语编程】 就是希望能在这方面做一些开拓性的工作,提供一个试验性质的平台,可以让对此感兴趣的开发者以此项目为基础继续深入研究。
第二种场景的配置方式
需要修改 Emacs 的配置文件,在 LispBox 环境中是通过 lispbox.el 文件进行配置的,在该文件中增加如下内容:
(set-language-environment "utf-8")
(set-buffer-file-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-selection-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-clipboard-coding-system 'utf-8) 
 
(setq ansi-color-for-comint-mode t)
(setq-default pathname-coding-system 'utf-8)  
(setq default-process-coding-system '(utf-8 . utf-8))  
(setq locale-coding-system 'utf-8)
(setq file-name-coding-system 'utf-8) 
(setq default-buffer-file-coding-system 'utf-8)  
(setq slime-net-coding-system 'utf-8-unix)
 
(modify-coding-system-alist 'process "*" 'utf-8)  
(prefer-coding-system 'utf-8)
说实话,除了少数几条配置的作用比较明确,我也不是很确定上述这些配置具体哪条会起什么作用,大家就根据名称自己顾名思义一下吧,当然如果有人能够详细整理一下每条的确切作用共享出来,那就最好不过了。 :)
修改完成后,重启 LispBox,你的开发环境就支持使用中文字符做变量名和函数名了===没错,我的环境就是这样设置的,现在我们再把刚才那个问好函数修改完善一下,增加下面这个函数:
(defun 你好 ()
    (format t "你好,世界!--我使用了中文函数名称!"))
然后使用 C-c C-k 在文本编辑缓冲区完成编译,再使用 C-c C-y 把函数名称发送到 REPL 进程上的输入区域,回车,全部显示如下:
CL-USER> 
;Compiling "/Users/admin/ECode/Markdown-doc/hi.lisp"
CL-USER> (你好 )
你好,世界!--我使用了中文函数名称!
NIL
CL-USER>
哈,恭喜你,终于可以使用中文来自定义函数名称了,话说我实在是受够那些无比冗长的英文函数名称了。英文是一种一维的线性文字,适合听觉处理而不适合视觉处理,想
表达清楚一个含义,必须使用长长的一串字母组合,而中文的优势就是它是一种非线性的二维文字,相对来说更适合视觉处理(其实中文也适合听觉处理,虽然有不少同音字,但是根据上下文可以清晰确定其确切含义)。一般来说:2个中文字符占据4个字节,4个字节对应4个英文字母,4个英文字母所能表述的内容跟2个中文字符所能表述的内容一对照就逊色很多了,在不影响清晰表达的前提下,用中文来做函数名可以比英文缩短一半以上。当然也有其他类型的使用不同字节的中文编码,还有可变字节的编码,这些就不一一细述了,感兴趣的朋友可以自行查阅相关资料。正是基于上述原因,我建议写代码时更多使用中文字符,这样可以有效缩短你源代码文件的长度,而且你的项目越大,这种效果越明显,越有利于节能减排。 :)
【注意】: 
切记!千万不要在中文输入状态下输入各种符号,比如汉字的圆括号–》 () ,如果在程序中误用了汉字符号,也就是全角符号,会产生编译错误!!因为半角符号和全角符号对应的内部编码是不同的!!因此 Common Lisp 程序代码中所有的中文字符以外的其他标点符号必须使用英文方式输入,也就是要使用半角符号,而不是全角符号。这里的中文字符以外的符号指的是半角括号、逗号、单引号、反引号、双引号等符号,使用本教程的 .emacs 配置文件,会自动把中文符号和英文符号设置为不同的颜色:
半角的英文符号一律为蓝色
全角的中文符号一律为绿色
可以来这里下载 Emacs 配置文件:
https://github.com/FreeBlues/PwML/blob/master/.emacs
初学者最好使用一键式开发环境,可以节省很多不必要的投入,推荐 LispBox各种 Emacs 快捷键使用技巧可以大幅提升你的工作效率几种特殊键的代表符号:


C Ctrl 键
M Meta 键(也就是 Alt 键)
Command Command 键 ( Mac 机型的特殊键)
交互编程最重要的几个快捷命令:


C-c C-z 从代码编辑区切换到 REPL 区;
C-c C-y 把正在编写的函数名称发送到 REPL 区进行调试;
C-x o 从 REPL 区 切换到代码编辑区;
M-p 在 REPL 区查找历史命令,向前翻页
M-n 在 REPL 区查找历史命令,向后翻页
M-. 同时按 Alt 键 和 点键 . ,查看当前光标所在位置的函数的


源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值