简介

Lisp,名称源自列表处理器(英语:List Processor)的缩写,最早由约翰·麦卡锡在1958年基于λ演算创造,演化至今,是历史第二悠久的高级语言,仅次于Fortran,也是第一个函数式编程语言。

1980年代盖伊·史提尔二世编写了Common Lisp试图进行标准化,这个标准被大多数解释器和编译器所接受。还有一种是编辑器Emacs所派生出来的Emacs Lisp(而Emacs正是用Lisp作为扩展语言进行功能扩展)非常流行,并创建了自己的标准。

LISP基本构建块

Lisp程序是由三个基本构建块

  1. 原子(atom)

    一个原子是一个数字连续字符或字符串。它包括数字和特殊字符。比如

    hello-world
    imfidding
    123
    #name
    ...
  2. 列表(list)

    列表是包含在括号中的原子和/或其他列表的序列,有点类似于数组。比如

    (i am fidding) 
    (the (1 2 3) is (hello))
  3. 字符串(string)

    字符串是一组括在双引号字符。比如

    "hello world"
    "你好!"

LISP的基本操作符

  1. quote

    (quote a) 即返回a,等同于 'a简写。

    quote写成' 只是一种语法糖,我们更常用的为后者的写法。

  2. atom

    (atom a),用来判断a是否为atom类型, 当a是一个atom或者空的列表(list)时,返回原子t,否则返回NIL。

    在lisp中,我们用原子t表示真,用nil或者()表示假。

    例如

    (atom 'a)

    返回

    t
  3. eq

    (eq x y),当x和y指向相同的对象的时候返回t,否则返回NIL。

  4. car

    (car x)要求x是一个表,它返回x中的第一个元素。

  5. cdr

    (cdr x)同样要求x是一个表,它返回x中除第一个元素之外的所有元素组成的表。

LISP变量与常量

  1. 全局变量

    全局变量有永久值在整个LISP系统,并保持有效,直到指定的新值。

    1. 可以使用defvar结构一般声明,例如
      (defvar x 123)

      即声明了一个类型为var的变量符号x,并赋值为123

    2. 也可以使用setq来声明为定义类型的变量,例如
      (setq x 123)
  2. 局部变量

    局部变量是指只在给定的过程中生效。 局部变量也可以使用setq来声明,此外还有其他两种方式letprog

    1. let声明,结构如下,
      (let ((var value) (var2 value2))...)

      例如

      (let ((x 'a)
       (y 'b)
       (z 'c))

      即列表中放键值对,将x赋值为a,y赋值为b,z赋值为c。

    2. prog声明,例如
      (prog ((x '(a b c))
      (y '(1 2 3))
      (z '(a s d)))
  3. 常量

    常量使用defconstant结构声明。例如

    (defconstant PI 3.141592)

LISP决策

决策就是当条件为true,则执行;当条件为false,则执行其他条件。

  1. cond结构,cond的基本语法规则为

    (cond   (cod1    action1)
        (cod2    action2)
         ...
        (codn   actionn))

    即第一次执行决策cod1,如果为真,那么执行action1语句;如果计算解决为nil,那么执行下一个决策cod2,当所有的条件都为nil,那么结果将返回nil。

  2. if结构,if的基本语法规则为

    (if (test-clause) (<action1) (action2))

LISP函数

命名函数defun宏用于定义函数,该函数需要三个参数,函数名(name),参数(args),函数体(body),其结构如下

(defun name (args)
    "description"
    body
)

例如

(defun sum (a b c d)
    "改行数用于计算4个数总和"
    ( + a b c d)
)

这样就定义了一个简单的函数,即sum函数传入4个参数,用于执行+函数操作,当执行

(write(sum 1 2 3 4))

返回

10

总结

emacs lisp的语法不止这些,本文只是简单的介绍了一些基本概念,或者说是一些入门级的语法。

happy joining !