初识LISP(1)——基本的结构、语法与数据类型
来源:互联网 发布:销售知乎 编辑:程序博客网 时间:2024/04/29 15:40
既然下定决心学习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—数据类型
类型说明符是数据类型的系统定义的符号。
没有什么可说的,类型说明符也只能等以后遇见什么再聊吧。先看几行代码吧:
(setq a 10)(print a);前一句可以理解成a是10的变量引用,这里打印了a(setq b 20)(print (type-of b));
输出结果为
(INTEGER 0 281474976710655)
很显然这里输出的b的类型,而后面的两个数代表的是b的值在这个范围内,后面那个数肯定是有背景的,换算成十六进制即为FFFF FFFF FFFF ,可以尝试一下当输入为
(setq x 281474976710656) ;构建一个符号指定一个值(setq x 281474976710657)(print (type-of x));分别运行上面的代码,得到的都是 (INTEGER (281474976710655)) ,即是变量的值大于这个临界值。
四、LISP—宏
我觉得这里的宏完全可以当做函数对待,宏的定义是使用defmacro来实现的。
;宏定义(defmacro setTo10(num) (setq num 10) (print num))(setq x 25)(print x)(setTo10 x)
五、LISP—变量
全局变量是通过defvar来定义的,而局部变量有三种结构可以创建:setq、let和prog
(defvar x 123);(print x)(write x)(setq x 10)(setq y 20)(format t "x = ~2d y = ~2d ~%" x y);类似于C语言的形式,大概理解是令t指向总字符串(format t "x = ~2d y = ~2d " x y);“~%”是换行作用,~2d是两位整型数
;局部变量的使用,分别定义的x、y和z之间不互相冲突(let ((x ' a) (y ' b) (z ' c))(format t "x = ~a ~% y = ~a ~% z = ~a ~%" x y z))(prog ((x ' (a b c)) (y ' (1 2 3)) (z ' (p q 10)))(format t "x = ~a ~% y = ~a ~% z = ~a" x y z));~b是输出二进制编码,~a是输出字符
六、LISP—常量
常量通过defconstant声明得到,defun即是定义函数。
;声明圆周率为全局常量,定义一个得到圆面积的函数(defconstant PI 3.141592)(defun area-cirlce(rad) (terpri) (format t "Radius = ~5f" rad) (format t "~%Area = ~10f" (* PI rad rad)))(area-cirlce 10)
七、LISP—运算符
运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。其中对数据的运算操作归类为四种:算术运算、比较操作、逻辑运算和位运算。
算术运算:
比较操作:
布尔值逻辑操作:
对数位运算操作:
这里就只给出算术运算和比较运算的代码,其中对数位运算就是以二进制数之间进行与、或、异或等操作,然后运算的结果以十进制的形式输出。
;运算符,算术运算(setq a 10)(setq b 20)(format t "~%和:~d" (+ a b))(format t "~%差:~d" (- a b))(format t "~%积:~d" (* a b))(format t "~%商:~d" (/ a b))(format t "~%取余:~d" (mod a b))(format t "~%取余2:~d" (rem a b))(format t "~%加的和:~d" (incf a 3))(format t "~%减的差:~d" (decf a 5));比较运算(format t "~%是否相等? ~a" (= a b))(format t "~%是否不等? ~a" (/= a b))(format t "~%是否小于? ~a" (< a b))(format t "~%是否大于? ~a" (> a b))(format t "~%是否大于等于? ~a" (>= a b))(format t "~%是否小于等于? ~a" (<= a b))(format t "~%最大值? ~a" (max a b 15 30))(format t "~%最小值? ~a" (min a b 15 30))
- 初识LISP(1)——基本的结构、语法与数据类型
- 初识LISP(2)——结构、循环与函数
- lisp基本语法——(一)
- Common Lisp学习之一:初识CL的语法与语义
- HTML的文档结构与基本语法
- 【Successful Lisp】语法(1)
- Common Lisp语法——数字,字符与字符串
- ruby: 基本数据类型与语法
- lisp 语法与语义
- JavaScript基础1——基本语法和数据类型
- Java 基本语法(一)——数据类型
- shell学习(一)——基本数据类型和语法
- Java 基本语法——数据类型
- Java基础语法(二)—基本数据类型转换
- Common Lisp语法——函数定义
- Common Lisp语法——变量
- Common Lisp语法——自定义宏
- Core Java (二) Java的基本结构与数据类型
- 轮询(Ajax)和(long)
- Couldn't construct AndroidInput, this should never happen
- UUID
- eclipse src 中的org.cocos2dx.lib 文件夹下的ResizeLayout.java 报错解决办法
- Android 动画-前言
- 初识LISP(1)——基本的结构、语法与数据类型
- composer 下载更新慢
- Oracle建立表空间和用户
- 欢迎使用CSDN-markdown编辑器
- 阿里云提示 Didcuz memcache+ssrf GETSHELL漏洞修复方法
- lambda表达式
- 金明的预算方案 01背包变形
- 121. Best Time to Buy and Sell Stock
- 金融保险中的几个概念