- 外文名
- Locator ID Separation Protocol
- 缩 写
- LISP
- 中文名
- 定位编号分离协议
- 实 质
- IPinIP的协议
-
Lisp
2018-08-20 00:01:18lisp作为符号处理语言,处理的对象主要是符号表达式,即S表达式,而并非数。 原子 atom 1.十进制数 2.以字母或问号开头,可以包含中横线、字母或数字; 例如 1 ab ?c-d NIL S表达式 1.原子是S表达式式 2.( S...Lisp
基本概念
lisp作为符号处理语言,处理的对象主要是符号表达式,即S表达式,而并非数。
原子 atom 1.十进制数 2.以字母或问号开头,可以包含中横线、字母或数字;
例如 1 ab ?c-d NIL
S表达式 1.原子是S表达式式 2.( S表达式 圆点. S表达式) 组成;
例如:atom (a(b.c))
点对表示法 1. 如果圆点右边紧接着一个左括号,可以去掉圆点,左右括号;
如: (a.(b.(c.d)) ——> (a b c.d)
2.去掉.nil (a.nil)——> (a)
表
lisp常用的特殊的s表达式——表。
空表
()或者是NIL
1.是atom 2.表示真值假 3.表示空表
是唯一一个既是原子又是表的表达式。
注意:原子除了nil外都不是表,a不是表,(a)是表,因为(a)即(a.nil)。
区分程序和数据 用单引号(G(quote(a b)) (G `(a b))
如果表达式本身就是数原子或者T或者nil,求值时,他们有没有`或quote都没关系。
七个基本运算符
1.quote
2.atom
3.eq (eq x y) 如果 x 和 y 的值是同一个原子或都是空表返回 t,否则返回空表() (即 nil)
4.car (car x)要求参数 x 的值是一个表,它返回 x 的第一个元素
5.cdr (cdr x) 要求参数 x 的值是一个表,返回 x 的第一个元素之后的所有元素
6.cons (cons x y)要求 y 是一个表,它返回一个表,表的第一个元素是 x,其后是 y 中的所有元素
7.cond> (cond ((eq 'a 'b) 'first) ((atom 'a) 'second) ((> 4 6) (+ (* 2 3) 7)) ) second
输入输出
1.format
> (format t "~%The clever dog can do ~A + ~A =~A ." 2 3 5) The clever dog can do 2 + 3 =5 . NIL //Fortmat 的第一个参数是输出地,此例的参数 t 表示输出到 toplevel,在 toplevel 环境下用户输入的表达式都将被求值。;第二个参数是输出格式串, //~%表示换行,~A 表示该位置将用对应的参数进行替换 //~S 可以打印出控制符,而~A 不能。~P 打印复数后缀”s” //~D ~B ~O ~X ~R 为整数控制符,它们分别打印十进制、二进制、八进制、十六进制、基数 //~E ~F ~G ~$为浮点数控制符,分别按照指数格式、定点格式、浮点格式、浮点定点结合方式 //~n%,~n&,~| 为空白控制符,分别表示 n 换行,n-1 行,新一页
2.read
(setf a (read)) Lisp LISP
函数作为参数
> (apply #'area '(2)) 12.5663706143592 > (apply #'* '(1 2 3 4)) 24 > (funcall #'area 2) 12.5663706143592 > (funcall #'* 1 2 3 4) 24 //apply 与 funcall 的区别。Apply 要求其最后一个参数是一个表,表中列出相应的函数所需的 参数,如 area 需要一个参数,所以例中 apply 使用方式是 (apply #’area ‘(2)),相当于(area 2);funcall 则不同,函数所需的各参数直接跟在 函数名参数之后,不能是表,所以例中(funcall #’* 1 2 3 4),相 当于(* 1 2 3 4)。
Lambda表达式
(f a1 a2 … an) 并且 f 的值是一个函数(lambda (p1 p2 … pn) e),则上述表达式等价于((lambda (p1 p2 … pn) e) a1 a2 … an) 定义兼调用
-
lisp
2017-06-28 17:08:45LISP 名址分离网络协议。LISP在近几年也指一种名址分离网络协议,即 Location-ID Separation Protocol。 在Internet的不断发展和壮大的同时,也呈现出了更多的弊端以及面临着诸多方面的挑战,包括全局路由表...LISP
名址分离网络协议。LISP在近几年也指一种名址分离网络协议,即 Location-ID Separation Protocol。
在Internet的不断发展和壮大的同时,也呈现出了更多的弊端以及面临着诸多方面的挑战,包括全局路由表的持续不断的增长、缺乏对multi-homing和业务量工程以及移动性和安全性很好的支持等多方面的因素。
为了彻底地解决上述问题,众多研究者都提到名址分离这一想法,如LISP\HIP等。在LISP中,原有的网络IP地址被分成EID(end-identifier)和RLOC(routing locator)。其中,EID用于标志主机,不具备全局路由功能;RLOC用于全网路由。名址分离网络自然会引入名与址的映射,即LISP中EID-to-RLOC的映射。众所周知,分级结构有着非常明显的优点,如结构简单、查询效率高等;已有方案中HRA、HAIR、RANGI、HiiMap、Lisp_CONS都提到采用分级结构进行映射系统的设计。
-
LISP
2015-05-25 19:18:14Lisp,最初被拼为LISP,一个历史悠久的电脑编程语言家族。最早由约翰·麦卡锡在1958年基于λ演算创造,演化至今,是历史第二悠久的高级语言,仅次于Fortran,也是第一个函数式编程语言。 其名称源自列表处理器...Lisp,最初被拼为LISP,一个历史悠久的电脑编程语言家族。最早由约翰·麦卡锡在1958年基于λ演算创造,演化至今,是历史第二悠久的高级语言,仅次于Fortran,也是第一个函数式编程语言。
其名称源自列表处理器(英语:List Processor)的缩写。LISP有很多种方言,各个实现中的语言不完全一样。LISP语言的主要现代版本包括Common Lisp, Scheme,Racket以及Clojure。1980年代盖伊·史提尔二世编写了Common Lisp试图进行标准化,这个标准被大多数解释器和编译器所接受。还有一种是编辑器Emacs所派生出来的Emacs Lisp(而Emacs正是用Lisp作为扩展语言进行功能扩展)非常流行,并创建了自己的标准。
历史
1955年至1956年间,信息处理语言被创造出来,用于人工智能处理(早期的基于符号处理的人工智能领域,以图灵测试为目标)。此领域中有研究者持有观点:“符号演算系统可以派生出智能。”[1])。它首先使用了列表 (抽象数据类型)与递归。
1958年,约翰·麦卡锡在麻省理工学院发明了Lisp这个编程语言,采用了信息处理语言的特征。1960年,他在《ACM通讯》发表论文,名为《递归函数的符号表达式以及由机器运算的方式,第一部》(Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I)。在这篇论文中,他展示了,只要通过一些简单的运算符,以及用于函数的记号,就可以创建一个具图灵完备性语言,可用于算法中。
麦卡锡最初使用M表示式(M-expression)写成代码,之后再转译成S表示式,举例来说,M表示式的函数语法,
car[cons[A,B]]
,等同于S表示式的(car (cons A B))
。然而由于S表示式具备同像性的特性(homoiconic,即程序与数据由同样的结构存储),实际应用中一般只使用S表示式。此外,他也由借用了信息处理语言中的许多概念。约翰·麦卡锡的学生史帝芬·罗素在阅读完此论文后,认为Lisp编程语言当中的eval函数可以用机器码来实做。他在IBM 704机器上,写出了第一个LISP解释器。1962年,蒂姆·哈特(Tim Hart)与麦克·莱文(Mike Levin)在麻省理工学院,以Lisp语言,实做出第一个完整的lisp编译器。
基本介绍
LISP是第一个函数式程序语言,区别于C语言、Fortran等命令型程序语言和Java、C#、Objective-C等面向对象程序语言。
由于历史的原因,Lisp长期以来被认为主要用于人工智能领域,但Lisp并不是只为人工智能而设计,而是一种通用的程序语言。
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。如果使用C语言或者Java语言的表达方式,可以说成:上面这段代码返回的值是a。
'a
这个表达式和上面的那个相同,值也是a。将quote写成 ' 只是一种语法糖。
被quote起来的单一个元素会成为symbol(例如'a)。symbol是Lisp中的一个特别概念,他在代码中看起来是个string,但并不尽然,因为symbol其实会被Lisp解释器直接指向某个存储器位置,所以当你比较'apple和'apple两个symbol是否相同时,不需要像是比较string一样一个个字元逐字比较,而是直接比较存储器位置,故速度比较快(使用eq运算符来比较,如果使用equal运算符会变成逐字比较)。当你定义一个函数,或者定义一个变量时,他们的内容其实就是指向一个symbol。
基本操作符2 atom
(atom x)当x是一个atom或者空的list时返回原子t,否则返回NIL。在Common Lisp中我们习惯用原子t表示真,而用空表 () 或NIL表示假。
> (atom 'a) t > (atom '(a b c)) NIL > (atom '()) t
现在我们有了第一个需要求出自变量值的操作符,让我们来看看quote操作符的作用——通过引用(quote)一个表,我们避免它被求值(eval)。一个未被引用的表达式作为自变量,atom将其视为代码,例如:
> (atom (atom 'a)) t
这是因为
(atom 'a)
的结果(t
)被求出,并代入(atom (atom 'a))
,成为(atom t)
,而这个表达式的结果是t。反之一个被引用的表仅仅被视为表
> (atom '(atom 'a)) NIL
引用看上去有些奇怪,因为你很难在其它语言中找到类似的概念,但正是这一特征构成了Lisp最为与众不同的特点:代码和数据使用相同的结构来表示,只用quote来区分它们。
基本操作符3 eq
(eq x y)当x和y指向相同的对象的时候返回t,否则返回NIL,值得注意的是在Common Lisp中,原子对象在内存中只会有一份拷贝,所以
(eq 'a 'a)
返回t,例如:>(eq 'a 'a) t >(eq 'a 'b) NIL > (eq '() '()) t > (eq '(a b c) '(a b c)) NIL
基本操作符4 car
Contents of the Address part of Register number缩写
(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),如果y不是一个list,将会以dotted pair形式展现这个cons cell,例如:
>(cons 'a 'b) (a . b)
一个cons cell的第二项如果是另一个cons cell,就表示成表的形式,例如:
(cons 'a (cons 'b 'c))
就表示成 (a b . c) 若一个cons cell第二项为空,就省略不写,例如:
(cons 'a (cons '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
函数
七个原始操作符中,除了quote与cond,其他五个原始操作符总会对其自变量求值.我们称这样的操作符为函数.
语法和语义
Scheme的Hello World程序
(display "Hello, world!") ;; 在屏幕中打印出: Hello, world! ;; 函数定义 (define (hello) (display "Hello, world!")) ;; 函数调用 (hello) ;; 在屏幕中打印出: Hello, world!
Common Lisp的Hello World程序
(format t "hello, world!") ;; 在屏幕中打印出: hello, world! 函数定义: (defun hello-world () (format t "hello, world!")) 调用函数: (hello-world) ;; 在屏幕中打印出: hello, world! ;; 并以NIL作为函数的返回值
Clojure的Hello World程序
(print "hello, world!") ;; 在屏幕中打印出: hello, world! ;; 函数定义: (defn hello-world [] (print "hello, world!")) ;; 调用函数: (hello-world) ;; 在屏幕中打印出: hello, world! ;; 并以 nil 作为函数的返回值
Lisp的宏
Lisp的语法结构使数据与程序只是一线之隔(有quote就是数据,没quote就是程序)。由于Lisp这种“数据即程序、程序即数据”的概念,使Lisp的宏(Macro)变得非常有弹性:你可以定义宏,指定它应该被编译器翻译(宏展开)成什么程序,程序和数据都可以灵活地互相转换,最后展开的代码会成为整个程序的一部分。宏的实现非常倚重quote来达成。当你定义了一个宏,宏被quote的部分会先被编译器unquote,而没有quote、或已经被unquote的部分,则会先被求值。最终编译器生成的整个程序代码才是最后运行时的代码。以下以广泛使用的Emacs Lisp为示例(以下示例亦兼容Common Lisp),解释最基本的Lisp宏。
想要创建一个list并赋予给fruit这个变量时不能这样做,因为这个list没有被quote过,会被编译器视为“程序”运行(会把"apple"这个字符串当成函数解释),而不是“数据”,因而产生错误:
> (setq fruit ("apple" "banana" "citrus")) 錯誤:"apple" 不是一個有效函數。
但这样就正确了:
> (setq fruit (quote ("apple" "banana" "citrus"))) ("apple" "banana" "citrus") ;; 或者 > (setq fruit '("apple" "banana" "citrus")) ("apple" "banana" "citrus") ;; 也可以用(list...)運算子,這樣一樣可以建立list。因為list本身是個函數,本來就應該被當成程式執行而不是資料,所以不會報錯: > (setq fruit (list "apple" "banana" "citrus")) ("apple" "banana" "citrus")
前面有提到使用'符号这个语法糖能够代替quote,但还有另外一种符号是`,意义基本上与'相同,但被`包起来的部分可以再用来unquote;而'没有这种能力。
也就是说被`给quote起来的部分是数据,但使用逗号“,”来unquote,令被quote的数据变回程序。(注意quote只有一个arg,所以arg要用list包起来)
;; 使用`來quote整個list > `("apple" "banana" "citrus") ("apple" "banana" "citrus") ;; 使用逗號,來unquote,這樣fruit這個變量會被重新求值。 > `("apple" "banana" "citrus" ,fruit) ("apple" "banana" "citrus" ("apple" "banana" "citrus")) ;; 可以利用unquote的特性,定義一個函数,讓該函数根據輸入的參數回傳一個我們想要的list数据結構: (defun user-profile (name email mobile) `((name . ,name) (email . ,email) (mobile . ,mobile))) (user-profile "Richard" "rms@gnu.org" "Noooo!") => ((name . "Richard") (email . "rms@gnu.org") (mobile . "Noooo!"))
简易宏示例
这里定义一个宏叫做nonsense,这个宏可以方便地定义更多以nonsense为开头的新函数:
(defmacro nonsense (function-name) `(defun ,(intern (concat "nonsense-" function-name)) (input) ;intern可以將string轉成symbol (print (concat ,function-name input)))) ;; 解釋: ;; 這個宏在編譯時,`(defun 因為被quote所以不會被求值, ;; 但裡面的,(intern ...) 這一段從逗號開始,整個括號括起來的 ;; s-expression部份會被求值。這時作為argument輸入的function-name ;; 就是在這時被插進macro中。其餘剩下的部份因為仍然在`(defun的quote ;; 影響之下,並不會被求值。 ;; 現在宏展開完了,整個宏才被當成一般function執行。 (nonsense "apple") ;使用我們剛剛定義的 nonsense 這個macro來定義新的f函数 => nonsense-apple ;成功定義出了新的函数叫做 nonsense-apple (nonsense "banana") ;再使用一次宏來定義新的函数叫做 nonsense-banana => nonsense-banana ;成功定義了新的函数。 (nonsense-apple " is good") ;使用剛剛定義出的新函数 => "apple is good" (nonsense-banana " I love to eat") ;使用另一個剛剛定義函数 => "banana I love to eat"
注释
参见
外部链接
[隐藏] 编程语言分类按平台 .NET框架平台语言 Java虚拟机上的语言 按家族 C/C++语言 BASIC语言 有行号 无行号 Pascal/Delphi语言 按范式 声明式 函数式 Lisp家族 - LISP
- Scheme
- Common Lisp
- Clojure
- Racket
ML家族 逻辑式 命令式 结构化 过程式 面向对象 非结构化 元编程 泛型/模板 反射化 脚本语言 ECMAScript派生语言 Shell语言 专业工具语言 科学与统计计算 GPU用着色器语言 数据库相关编程语言 标记语言 SGML家族 XML家族 工业与辅助设计 其它 -
LISP和通用LISP编程LISP and Common LISP Programming
2019-11-13 20:56:28这是LISP和Common LISP编程的上一页,我们正在处理中,将那里的所有书籍都转换为新页面。 请再次检查此页面!!! -
关于Lisp,常见LISP的高级技术On Lisp, Advanced Techniques for Common LISP
2019-11-15 18:52:22以自底向上编程为统一主题,对高级Lisp技术进行了全面研究。 它给出了宏和宏应用程序的第一个完整描述。 -
Lisp:AutoLisp入门、操作编程实例详细攻略
2018-06-02 11:32:53Lisp:AutoLisp入门、操作编程实例详细攻略 目录 AutoLisp入门 1、图文教程 AutoLisp操作 AutoLisp入门 AutoLISP是由Autodesk公司开发的一种LISP程序语言,LISP是List Processor的缩写。通过auto...Lisp:AutoLisp入门、操作编程实例详细攻略
目录
AutoLisp入门
AutoLISP是由Autodesk公司开发的一种LISP程序语言,LISP是List Processor的缩写。通过autolisp编程,可以节省工程师很多时间。AutoLISP语言作为嵌入在AutoCAD内部的具有智能特点的编程语言,是开发应用AutoCAD不可缺少的工具。
1、图文教程
AutoLisp操作
Autolisp:利用AuoCAD之Lisp编程案例之自动智能获取所选对象的面积并标注在指定位置
Autolisp:利用AuoCAD之Lisp编程案例之自动智能绘制枫叶玫瑰
AutoLisp:AutoLisp实现对AutoCAD进行输入命令,选择对象,实现不同方向进行缩放
Autolisp:利用AuoCAD之Lisp编程案例之智能加工齿轮的演示程序 -
lisp表达式
2018-12-29 09:09:54lisp表达式代码资源,程序设计基础作业。 -
基本的Lisp技术Basic Lisp Techniques
2019-10-29 02:34:00本书演示了使Common Lisp优于许多竞争对手的功能,并为读者提供了将Common Lisp用作开发环境的快速入门指南。 -
常见的Lisp食谱The Common Lisp Cookbook
2019-11-15 19:07:13为Common Lisp中的任何编程人员提供的问题,解决方案和实际示例的完整集合。 -
programming in lisp
2018-12-17 14:14:09programming in lisp -
Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot
2019-10-05 23:35:36Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - HyperpolyglotLisp: Co... -
lisp语言_Lisp劝退篇
2020-11-28 07:31:29Common Lisp下称CL。难度大我学Lisp很费劲,就个人而言Lisp是投入精力第二多的IT技术(仅次于C++)。CL的宏屡屡让我绝望,感觉比C++的模板元编程还难。解:忍 || 滚用途少搜一下会发现:用CL的公司很少,工作机会也...
-
SQL Server 2012案例教程.rar
-
[] 操作符支持DataFrame实例
-
JAVASE.pdf
-
CentOS-7-1908.zip
-
【数据分析-随到随学】机器学习模型及应用
-
量化高频交易系统tick数据采集
-
IC卡软件:包含几个可以用的工具,需要搭配硬件设备
-
一个致力于微信小程序和Web端同构的解决方案
-
深入浅出安卓开发!10天用Flutter撸了个高仿携程App,吊打面试官系列!
-
Leagene纤维素染色液(Gram甲紫法)
-
为网友解答:继续教育怎么才能合格?继续教育答题神器有没有?
-
Redis数据库入门与使用
-
python 爬虫 UserAgent 随机生成 Python使用三方库 fake_useragent
-
非常详细的LTE信令流程.docx
-
jdk-8u141-windows-x64.rar
-
详细解释为什么TCP连接需要三次握手?一次 两次 四次 五次会怎么样?
-
RabbitMQ消息中间件实战(附讲义和源码)
-
智联万物,京东IoT技术创新与实践
-
jmeter性能监控插件.zip
-
pyechart数据可视化