既然下定决心学习LISP,我计划学习LISP的过程都以博客的形式做总结。当然是需要参考学习网上的教程,网上的教程讲解的比较详细。而我打算以自己的理解来做尽可能简洁的总结,一方面将自己的学习过程做一个回顾,另一方面,如果日后忘记了什么知识点,也方便查询。
一、LISP—程序结构
首先lisp很独特的一点就是圆括号,程序自始至终都是圆括号,例如函数、表达式……这一特色的功能与Java的花括号“{}”和Python的缩进功能类似。LISP的前缀表示方法类似于栈的概念,即a+b,写作(+ a b),下面第一句就是实现(3+5)/2,值得注意的是运算符和数字之间必须以空格间隔开,这是最基本的语法要求。
(print (/ (+ 3 5) 2))
(format t "~%");打印一个换行符
(write-line "Hello World!");最经典的,打印“Hello World!”
二、LISP—基本语法
这里需要记住的是LISP的三个基本块:原子、列表和字符串。原子可以理解成编译器视角下的单一元素,可以由数字、字母和特殊字符组成。而列表是包含原子与子列表的序列。字符串是由双引号括起的字符。
需要注意的是1.LISP语言不区分大小写;
2.过去调用函数的方式为f(x),而在LISP的世界一切都是平等的,写作(f x);
3.只有三种类型的元素是常数,返回的是自己的值:数字;字母t,代表逻辑真;nil,代表逻辑假,还有一个空的列表。
LISP允许名字里包含数字,但是也别过分到都是数字,这样编译器只能认为这是数字了好吧。之前说原子里可以包含特殊字符,比如什么双引号、冒号什么的,那么也需要有转义字符的,转义字符是()。
最后值得一提的,先看代码:
(write (* 2 3));这行代码会打印出乘法结果6,而如果要打印出(* 2 3),也就是不进行求值,那可以通过以下代码实现
(write ' (* 2 3));没错,就是加一个单引号在前面~~其实想实现这个功能还有一种办法的
(format t "(* 2 3)");最传统的打印字符串的好吧,其实也就是打印原子或列表的字面结果。
三、LISP—数据类型
类型说明符是数据类型的系统定义的符号。
array | fixnum | package | simple-string |
atom | float | pathname | simple-vector |
bignum | function | random-state | single-float |
bit | hash-table | ratio | standard-char |
bit-vector | integer | rational | stream |
character | keyword | readtable |