zoukankan      html  css  js  c++  java
  • Lisp语言简介

    摘自维基百科,原链接为:http://zh.wikipedia.org/zh/LISP

    因为Clojure是Lisp的一种的方言,所以我们可以先来了解一下Lisp这个比较小众的编程到底是什么~

    ---------------------------------------------------------------------------

    LISP(全名LISProcessor,即列表处理语言),由约翰·麦卡锡1960年左右创造的一种基于λ演算函数式编程语言

    LISP有很多种方言,各个实现中的语言不完全一样。1980年代Guy L. Steele编写了Common Lisp试图进行标准化,这个标准被大多数解释器和编译器所接受。在Unix/Linux系统中,还有一种和Emacs一起的Emacs Lisp(而Emacs正是用Lisp作为扩展语言进行功能扩展的)非常流行,并建立了自己的标准。

    LISP语言的主要现代版本包括Common LispScheme

    基本介绍

    LISP 是第一個函數型程式語言,区别于C/Java等命令型编程语言。

    由于历史的原因,Lisp长期以来被认为主要用于AI领域,但Lisp并不是为AI而设计,而是一种通用的编程语言.

    Lisp的表达式是一个原子(atom)或表(list),原子(atom)又包含符號(symbol)與數值(number);表是由零个或多个表达式组成的序列,表达式之间用空格分隔开,放入一对括号中,如:

    abc()(abc xyz)(a b (c) d)

    最后一个表是由四个元素构成的,其中第三个元素本身也是一个表,這種 list 又稱為嵌套表(nested list)。

    正如算数表达式 1+1 有值 2 一样,Lisp 中的表达式也有值,如果表达式 e 得出值 v,我们说 e 返回 v。如果一个表达式是一个表,那么我们把表中的第一个元素叫做操作符,其余的元素叫做自变量。

    Lisp 的 7 个公理(基本操作符)

    • 基本操作符1 quote

    (quote x) 返回 x,我们简记为 'x

    > (quote a)a> 'aa

    • 基本操作符2 atom

    (atom x) 当 x 是一个原子或者空表时返回原子 t,否则返回空表 ()。在 Lisp 中我们习惯用原子 t 表示真,而用空表 () 表示假。

    > (atom 'a)t> (atom '(a b c))()> (atom '())t

    现在我们有了第一个需要求出自变量值的操作符,让我们来看看 quote 操作符的作用——通过引用(quote)一个表,我们避免它被求值。一个未被引用的表达式作为自变量,atom 将其视为代码,例如:

    > (atom (atom 'a))t

    这是因为(atom 'a)的结果(t)被求出,并代入(atom (atom 'a)),成为(atom t),而这个表达式的结果是t。

    反之一个被引用的表仅仅被视为表

    > (atom '(atom 'a))()

    引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了 Lisp 最为与众不同的特点——代码和数据使用相同的结构来表示,而我们用 quote 来区分它们。

    • 基本操作符3 eq

    (eq x y) 当 x 和y 的值相同或者同为空表时返回t,否则返回空表 ()

    > (eq 'a 'a)t> (eq 'a 'b)()> (eq '() '())t

    • 基本操作符4 car

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

    > (car '(a b))a

    • 基本操作符5 cdr

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

    > (cdr '(a b c))(b c)

    • 基本操作符6 cons

    (cons x y) 返回一个cons cell (x y),例如:

    > (cons 'a 'b)(a . b)

    一个cons cell的第二项如果是另一个cons cell,就表示成表的形式,例如:

    (a . (b . c))

    就表示成

    (a b . c)

    若一个cons cell第二项为空,就省略不写,例如:

    (a . (b . ()))

    表示为

    (a b)

    这样,多重的cons cell就构成了表:

    > (cons 'a (cons 'b (cons 'c ())))(a b c)

    • 基本操作符7 cond

    (cond (p1 e1) ...(pn en)) 的求值规则如下. 对“条件表达式p”依次求值直到有一个返回t. 如果能找到这样的p表达式,相应的“结果表达式e”的值作为整个cond表达式的返回值.

    > (cond ((eq 'a 'b) 'first) ((atom 'a) 'second)) second


    函数

    当表达式以七个原始操作符中的五个开头时,它总会对其自变量求值的. 我们称这样的操作符为函数.

  • 相关阅读:
    LeetCode15题: 寻找三数和,附完整代码
    LeetCode 11 水池蓄水问题
    分布式初探——分布式事务与两阶段提交协议
    高等数学——讲透求极限两大方法,夹逼法与换元法
    书籍推荐——一本老书,吴军老师《数学之美》
    概率统计——期望、方差与最小二乘法
    算法浅谈——递归算法与海盗分金问题
    机器学习基础——带你实战朴素贝叶斯模型文本分类
    线性代数精华——从正交向量到正交矩阵
    LeetCode10 Hard,带你实现字符串的正则匹配
  • 原文地址:https://www.cnblogs.com/xymqx/p/4424336.html
Copyright © 2011-2022 走看看