首先,我们来看几个 hello world 例子:
- 示例 1. 打印5行helloworld
英语:
print 5 line "hello world"
Lisp:
(print 5 line "hello world")
或(打印 5 行 "hello world")
- 示例 2. 字符串"hello world"
英语:
the string "hello world"
Lisp:
(the string "hello world")
或#T(字符串 "hello world")
- 示例 3. John 说:“hello world”
英语:
"hello world," John said
Lisp:
(say :by John "hello world")
或#P(John say "hello world")
或(John 说 "hello world")
看到这里,或许有人已经把上面的例子在lisp实现中试了下,然后遇到了一堆错误。并不是我捉弄大家,上面那些确实可以作为Lisp语言的程序,只不过各位手上的Lisp实现还处于幼儿状态,未觉醒相关技能。(后面会告诉大家怎么让Lisp实现理解这些话语,如果用作弊手法的话,每个例子不超过10行代码)
好了,言归正传,下面附上能运行的 hello world:
(print "hello world")
我们可以看到上述的Lisp程序都有个普遍的特征:都是 (xxx ......)
这样的括号包含符号形式。这里需要说明下,Lisp被是表处理的缩写,这里括号包起来的就是表,例如,(1 2 3 4)
就是说一个表,包含元素1、2、3、4,而空表就是()
。Lisp的程序就是由这样的表组成,换句话说,任何可以用这样的表来表示的都可以成为Lisp程序。
可能有人会注意到,有些符号是say
这样的单词,而有些就是:by
这样前面带有特殊符号的单词,后期我们还会看到例如test-var
,*global-var*
这样的多个单词组成的、带有前后缀的符号,这些并不是Lisp的语法的要求,而是人为约定的一种命名规范。
另外还有像#P(...)
还有#Y[...]
这类表达方式,这是Lisp实现提供的扩展语法的机制,后期详细介绍。
所以,从上面的例子可以看出,Lisp的样子是多变的,它可以是任何你想象中可以用表来表示的样子。