`
iyuan
  • 浏览: 471814 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lisp初体验-Practical Common Lisp笔记-6.语法及语义

    博客分类:
  • lisp
阅读更多
作为一本语言入门类书籍,终于要进入正题了!(不容易啊)

为什么满屏满目的括号?
这是一个问题么?对于初涉Lisp的人而言,是的。作者的解释就是不解释,熟悉了,你就懂了(好吧,其实是"详见后章")。总而言之,既然选择了,你就只能享受了(不许想歪!)。

与其他语言不同的是,lisp的编译器中有两个角色:reader和evaluator。reader负责把代码整成evaluator认识的东东,evaluator负责实现。(这里没太搞清楚,java什么的难道不是?或许神奇的宏在这儿做了些什么)

Lisp中的基本元素有:列表(list)和原子(atom)。列表是指由括号括起的东东:(),而原子呢就是除了列表之外的东东。不过常用的原子有这么三种:数字,字符串,名字。
数字:
123,1/4,1.0,-45,4/2,1.0e-4,1.0d0
上面的这些都归为数字,具体差异以后会讲。
字符串:
"abc","a\bc","a\"bc"
这些都是字符串了。
名字:
总的来说,变量名、方法名、宏名之类统称名字,用于指代他们本身。一个有效的命名不能出现这些东西:括号,单引号,双引号,反引号,逗号,冒号,分号,反斜杠,竖线(特殊字符)。当然,对于有编程经验的人而言,靠谱的字符串命名是相当有意义的,例如foo或者head。

这里有一个Lisp Form的概念,简单理解成lisp编译器认识的语句格式。其中最简单的莫过于原子了。其包含两个方面:符号和其他。
符号通常是个名字,比如:pi,代表圆周率。
其他通常就是数字、字符串了,有时候也可能是变量。
额,似乎有点绕(我也晕了)。不过不用担心,接下来就将三种常用的形式一一呈现:

函数调用:
(function-name argument*)

需要确保function-name是已经定义好的,后面跟随参数即可。例如:
(+ 1 2)  ----> 执行1+2
(* (+ 1 2) (- 3 4))   ---->执行1+2得到3,执行3-4得到-1,执行3×-1都得到-3

注意:lisp函数的调用与其他语言都不相同,函数名永远是在列表第一项,其后跟随参数。

特别运算:
并不是所有的功能都可以用函数调用来实现,比如:
(if x (format t "yes") (format t "no"))

如果按照函数调用的法则,简直就乱了套了,先要把后面的两个format执行了,再传入到If,明显与意图(如果x成立则yes,否则no)不符,所以需要独立。Lisp中类似if的一共定义了数十个,不过常用的不多,今后有涉及的话再介绍。这种特别运算的规则就是按照特别运算符自带的规则,比如这里的if:
(if test-form then-form [ else-form ])

再介绍两个特殊的运算符:quote,let
(quote (+ 1 2))  --->(+ 1 2)

等同于:
'(+ 1 2) -------> (+ 1 2)

(let ((x 10)) x)  #绑定变量,给x赋值10并返回x


宏:
又说到它了,而且还一天一个样。如果说上面两种都是依据规则而定,那么宏就是打破规则或者说是制定规则。
宏的应用分两步:进入宏,根据宏译成lisp的标准格式并lisp解析。是不是有点像前面介绍的lisp编译器的两个角色?宏实现了局部方言和标准的转换工作,或许可以称其为lisp中的lisp。不要晕,作者说,恩,之后还会有很多关于宏的东东!

这里再说说lisp的布尔数据:nil(false),t(truth)。
在lisp中,nil除了代表false外,也代表一个空的列表。在lisp中这些都是等值的:
nil, (), 'nil, '().
t只代表truth,t,'t也是等值的。

在lisp中用于等值判定的有四种:EQ,EQL,EQUAL, EQUALP(lisp不分大小写)
equal和equalp都可以理解成eql继承而来。所以,先比较下eq和eql:
eq 只适用于明确知道类型的比较,比如数字、字符串。
eql 相对没有那么严谨,可以比较相同类型的。
由此还引出了两个派别:"在可能的情况下用eq"派和"只用eql"派。(话说,我这而测不出差异来啊)
本文统一eql!
equal和equalp相对就更宽松了,比如字符串(equal "a" "a")值就是t,而equalp更进一步
(equalp 1 1.0)值也是t。

再来说说编码规范。
(some-function arg-with-a-long-name
               another-arg-with-an-even-longer-name)

(defun print-list (list)
  (dolist (i list)
    (format t "item: ~a~%" i)))

需要注意的几点:
1.缩进、对齐很重要。
2.收尾的闭括号紧接着最后的一个元素。
3.其实靠谱的编辑器都会自动做这个。

最后,关于代码注释:
lisp中的注释以分号(;)开始:
;;;; 全篇开始用四个分号.

;;; 段落开始用三个分号
;;; 然后紧接着就该是代码段落

(defun foo (x)
  (dotimes (i x)
    ;; 代码中的片段注释用两个分号开始
    ;; 紧接着的就该是代码片段
    (some-function-call)
    (another i)              ; 行注释用一个分号开始
    (and-another)           
    (baz)))

这些规则理论上并不强制,不过都是业内约定成俗的。从某种程度上来说,相信业内45年的经验吧~


(未完待续)
0
1
分享到:
评论

相关推荐

    Practical Common Lisp-1st-2005

    《Practical Common Lisp-1st-2005》是一本专注于Common Lisp编程语言的实用书籍,作者Peter Seibel通过这本书向读者展示了如何使用Common Lisp来解决真实世界中的问题,强调程序员作为工程师和艺术家的双重身份,而...

    common-lisp-the-language-second-edition.PDF

    common-lisp-the-language-second-edition.PDF

    Practical Common Lisp笔记

    《Practical Common Lisp笔记》是一本深入探讨Common Lisp编程语言的实用教程。Common Lisp是一种功能强大的多范式编程语言,以其动态类型、宏系统和丰富的内置数据结构而闻名。这篇笔记详细记录了作者在学习过程中...

    实用Common.Lisp编程.pdf

    - Common Lisp的基本语法和语义 - 如何利用宏系统增强代码的表达力 - 面向对象编程在Common Lisp中的实践 - 高级数据结构和算法的实现 - Common Lisp在实际项目中的应用实例 - 性能优化和调试技巧 总之,“实用...

    cad-lisp-3-表操作.LSP.lsp

    cad-lisp-3-表操作.LSP.lsp

    Lisp - 1990 - Common Lisp the Language, 2nd Edition - Steele, Guy L..pdf

    《Common Lisp the Language, 2nd Edition》是Guy L. Steele所著的一本关于Common Lisp编程语言的权威指南,作为第二版,它不仅继承了前一版的经典,还对Lisp语言进行了深入的扩展和更新。这本书是Lisp爱好者的宝贵...

    emacs-lisp-intro-2.04.tar.gz

    标题中的"emacs-lisp-intro-2.04.tar.gz"是一个典型的压缩文件名,它表明这个文件是一个关于Emacs Lisp的介绍性资料,并且版本号是2.04,格式为tar.gz。tar.gz是一种在Linux和Unix系统中常用的文件压缩格式,它先用...

    Practical Common Lisp pdf

    在压缩文件中,只有一个名为"practical_common_lisp.pdf"的文件,这是本书的PDF版本。由于原版PDF文件较大,经过7z压缩后,文件大小显著减小,便于下载和存储,但同时也能保持较好的图像和文字质量,满足读者的阅读...

    Successful Lisp How to Understand and Use Common Lisp - David B. Lamkins

    Provides practical advice for the construction of Common Lisp programs. Shows examples of how Common Lisp is best used. Illustrates and compares features of the most popular Common Lisp systems on ...

    AutoLisp源文件--标注高程.LSP

    AutoLisp源文件--标注高程.LSP

    ANSI Common Lisp 中文翻译版.pdf

    ANSI Common Lisp 中文翻译版.pdf 此资源是 ANSI Common Lisp 的中文翻译版,涵盖了 Common Lisp 语言的基础知识和高级主题。该资源包含了 17 章节,从基础的列表、特殊数据结构、控制流程、函数、输入与输出、符号...

    实用Common.Lisp编程

    这本《Practical Common Lisp》之所以号称Practical,正是因为这本书大量介绍Common Lisp在现实世界中的各种应用方式,算是第一本「入世传教」的Common Lisp著作。《Practical Common Lisp》是目前最畅销的Common ...

    lisp解密程序-适用于早期的Lisp程序

    6. **逆向工程**:对于某些高度混淆的加密代码,可能需要借助逆向工程的方法来理解加密逻辑,这涉及到对Lisp语法和语义的深入理解。 在"lisp解密程序(适用于老的加密文件)"这个文件中,可能包含了实现以上功能的...

    Practical Common Lisp

    Practical Common Lisp 学习lisp的入门书籍

    practical common lisp.pdf

    1. **解决实际问题**:书中不仅仅介绍了语言的基础语法,更重要的是通过具体的例子展示了如何使用Common Lisp来解决实际问题。 2. **易于理解**:作者Peter Seibel采用了一种非常平易近人的写作风格,使得即使是初学...

    Lisp-music-player.rar_autolisp_autolisp程序_lisp_player

    标题中的“Lisp-music-player.rar”表明这是一个基于Lisp语言开发的音乐播放器软件,其源代码或可执行文件被压缩在RAR格式的文件中。RAR是一种流行的压缩格式,通常用于存储和分发多个文件,它允许用户将多个文件...

    Practical Common lisp

    与其他关于Common Lisp的书籍不同,《Practical Common Lisp》不仅系统介绍了Common Lisp的基本语法和特性,更重要的是它侧重于展示如何将Common Lisp应用于实际项目中,通过大量的实例和案例来帮助读者理解并掌握这...

    lisp小工具-fx.zip

    计算多个数字之和、计算多条线段长度之和、插入墙高标注、查询多段线顶点坐标并绘制、自动生成页码、绘制示坡线、插入排水箭头 https://blog.csdn.net/qq_24141055/article/details/121446354

    Common-Lisp-Actors, 通用Lisp的actor系统.zip

    Common-Lisp-Actors, 通用Lisp的actor系统 这是一个简单且易于使用的Actor系统,在。设置需要波尔多螺纹。http://common-lisp.net/project/bordeaux-threads/ 2. 加载 actors.lisp 并开始使用它。 如果你有 Quick

Global site tag (gtag.js) - Google Analytics