基本语法
宏定义 (define pi 3.14) (define hi "hello") 定义一个过程 (define (add a b) (+ a b)) (add 10 20) 一个序对 (cons 1 2) (cons 1.1 "aa") 定义一个序对 (define x (cons 1 2)) (define y (cons 3 4)) (define z (cons x y)) car是Contents of Address part of Register寄存器的地址部分的内容 cdr是Contents of Decrement part of Register寄存器的减量部分的内容 (car (car z)) 结果是1 (car (cdr z)) 结果是3 (define c (cons 11 22)) (define d (cons 33 44)) (define x (cons a b)) (define y (cons c d)) (define z (cons x y)) (((1 . 2) 3 . 4) (11 . 22) 33 . 44) #z的值 # (car z) ((1 . 2) 3 . 4) #(caar z) (1 . 2) # (caaar z) 1 # (cdadr z) 相当于 cdr,car,cdr三个操作,先从cdr开始然后是car最后是cdr # cdr后就是 (11 . 22) 33 . 44), car后就是(11,22),最后cdr就是22 22 # (cddar z) 按照上面的推论结果就是4 #if表达式 (if predicate then_value else_value) and or not # 条件分支 (define test-age (lambda (age) (cond ((< age 16) "未成年") ((and (> age 16) (< age 28)) "少年先锋队") ((and (> age 28) (< age 40)) "成年人") ((and (> age 40) (< age 55)) "中年人") ((and (> age 55) (< age 70)) "老年人") (else "很老的年纪")) )) (test-age 19)
let语法
(let ((a 1) (b 2)) (+ a b)) #定义一个lambda再内嵌lambda的函数,其中包含了let定义 (define gg (lambda (x) (let ((a 10) (b 20)) (lambda (y) (let ((c 30) (d 40)) (+ (+ a c) (+ x y)) ))))) (gg 10) ((gg 1) 2) #结果 3 #<procedure> 43 #实际上,let表达式只是lambda表达式的一个语法糖 (let ((p1 v1) (p2 v2) ...) exp1 exp2 ...) ;⇒ ((lambda (p1 p2 ...) exp1 exp2 ...) v1 v2) #let*表达式可以用于引用定义在同一个绑定中的变量。 #实际上,let*只是嵌套的let表达式的语法糖而已。
一些内置的函数
pair? 如果对象为序对则返回#t; list? 如果对象是一个表则返回#t。要小心的是空表’()是一个表但是不是一个序对。 null? 如果对象是空表’()的话就返回#t。 symbol? 如果对象是一个符号则返回#t。 char? 如果对象是一个字符则返回#t。 string? 如果对象是一个字符串则返回#t。 number? 如果对象是一个数字则返回#t。 complex? 如果对象是一个复数则返回#t。 real? 如果对象是一个实数则返回#t。 rational? 如果对象是一个有理数则返回#t。 integer? 如果对象是一个整数则返回#t。 exact? 如果对象不是一个浮点数的话则返回#t。 inexact? 如果对象是一个浮点数的话则返回#t。 函数quotient用于求商数(quotient)。 函数remainder和modulo用于求余数(remainder)。 函数sqrt用于求参数的平方根(square root)。 三角函数sin,cos,tan,以及反三角函数asin,acos 指数函数exp 对数函数log 引用 quote (quote (+ a b)) 等于 '(+ a b) 其他一些判断数字的函数 odd? even? postitive? negative? zero? 在比较字符的时候可以使用 char=? char<? char>? char<=? char>=? 比较字符串时,可以使用 string=? string-ci=?
递归
(define (fact n) (if (= n 1) 1 (* n (fact (- n 1))))) (fact 5)的计算过程如下: (fact 5) ⇒ 5 * (fact 4) ⇒ 5 * 4 * (fact 3) ⇒ 5 * 4 * 3 * (fact 2) ⇒ 5 * 4 * 3 * 2 * (fact 1) ⇒ 5 * 4 * 3 * 2 * 1 ⇒ 5 * 4 * 3 * 2 ⇒ 5 * 4 * 6 ⇒ 5 * 24 ⇒ 120
尾递归
(define (fact-tail n) (fact-rec n n)) (define (fact-rec n p) (if (= n 1) p (let ((m (- n 1))) (fact-rec m (* p m))))) fact-tail计算阶乘的过程像这样: (fact-tail 5) ⇒ (fact-rec 5 5) ⇒ (fact-rec 4 20) ⇒ (fact-rec 3 60) ⇒ (fact-rec 2 120) ⇒ (fact-rec 1 120) ⇒ 120
用let实现循环和递归
let也可以用于递归 (define (fact-let n) (let loop((n1 n) (p n)) ; 1 (if (= n1 1) p (let ((m (- n1 1))) (loop m (* p m)))))) ; 2 #letrec类似于let,但它允许一个名字递归地调用它自己。 #语法letrec通常用于定义复杂的递归函数 (define (fact-letrec n) (letrec ((iter (lambda (n1 p) (if (= n1 1) p (let ((m (- n1 1))) (iter m (* p m))))))) ; * (iter n n)))
Lisp中的继续
#lang racket (define (product ls) (let loop ((list ls) (acc 1)) (cond ((null? list) acc) ((zero? (car list)) 0) (else (loop (cdr list) (* (car list) acc)) )))) (product '(2 4 7)) ;另外一种形式 (define (mul list sum) (if (null? list) (return sum) (* 1 (mul (cdr list) (* (car list) sum))))) (define (product list) (mul list 1)) (product '(2 4 7))
利用Racket画图
#lang slideshow ;定义一个填充的矩形,参数n是边长 (define (square n) (filled-rectangle n n) ) ;定义一个红色的矩形,将传入的矩形变为红色 (define (red p) (colorize p "red") ) ;定义一个黑色的矩形,将传入的矩形颜色变为黑色 (define (black p) (colorize p "black") ) ;定义上下左右四个同样的矩形,将传入的矩形按照上下左右做成四个对称的 (define (four p) (define two (hc-append p p)) (vc-append two two) ) ;定义左右反转的四个矩形 (define (c-four p1 p2) (let ((x1 (hc-append (red p1) (black p2))) (x2 (hc-append (black p2) (red p1)))) (vc-append x1 x2) ) ) ; 4*4的矩形 (define (four-four p) (four (four p)) ) ;4*4 颜色反转的矩形 (define (color-four-four p) (four (four (c-four p p))) ) ;四个连在一起的图形,mk是一个函数 (define (series mk) (hc-append 5 (mk 5) (mk 10) (mk 15) (mk 20)) ) ;定义一个a的函数,这个函数跟color-four-four效果一样,只是传入的参数是size整数 (define (a size) (color-four-four (square size)) ) ;(series a) ;跟上面的表达式执行结果一样,只是做成了一个匿名函数,这里series接受的参数是函数,这里就 ;体现出了函数编程的强大 (series (lambda(size) (color-four-four(square size)))) ;下面这个表达式也是一样的效果 (series (lambda(size) (four (four (c-four (square size) (square size))))))
执行结果
再画一个气泡
#lang slideshow (define (rgb-series mk) (vc-append (series (lambda (size) (colorize (mk size) "red"))) (series (lambda (size) (colorize (mk size) "green"))) (series (lambda (size) (colorize (mk size) "blue")))) ) (define (series mk) (hc-append 5 (mk 5) (mk 10) (mk 15) (mk 20)) ;(series (rgb-maker circle)) (rgb-series circle) ;(series (lambda (size) (colorize (mk size) "red"))) ;每一排的红色,绿色,蓝色气泡相当于下面这段 (series (lambda(size) (colorize (circle size) "red")) ) (define (rgb-maker mk) (lambda (sz) (vc-append (colorize (mk sz) "red") (colorize (mk sz) "green") (colorize (mk sz) "blue")))) (series (rgb-maker circle)) ;这里将一列当做一个元素 (rgb-maker circle)执行完后就是 (vc-append (colorize (circle size) "red")) ;再把上面的表达式运用到series中,size就是series函数的参数,有点像一列是一个整体
执行结果(第一个图是第一个函数rgb-series执行结果 第二个图是第二个函数rgb-maker的结果)
相关推荐
新的和更强大的方法教育学生的思考程序,该文本包含一个教程的例子,说明Lisp编程的基本概念,以及ANSI Common Lisp的一个跟上时代的总结,列出每个运营商在语言。信息和乐趣,它给学生提供了他们所需要的一切,开始...
二是学会总结,把学习、运用中的心得体会记下来,当成一种经验或者教训加以提炼并在日后的应用中加以改进,一定能提高你对这门编程语言的认识。以下是笔者在学习与运用ASP编程中的两点经验,希望能对大家有所帮助。
仅此一家,从创建到Lisp调用方法,这方面的资料很少,花了很多时间实现总结,希望能帮助到各位
” 很难用几句话来总结 Lisp 的所有好处。 但是,LambdaLite 所做的事情在大多数语言中是不可能的。 LambdaLite 的where子句是宏,用于查找以 '/' 为前缀的关键字并将其替换为行属性引用。 结果表达式变成了一个函数...
cad正交以及对象捕捉的总结,很好的cad小技巧
大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition)
公司总结的实用结构lisp工具箱,可以自己修改
rfc6830 是IETF对现有ip网存在问题总结后提出的LISP解决方案,详细介绍了LISP的功能的优点
目录 1.绪论 1 1.1、问题提出 1 1.2、开发环境的选择 1 2.系统功能分析与设计 1 ...5.1、将lisp程序加载到AutoCAD中 11 5.2、调用该程序,并进行调试 12 5.3、调试结果分析 13 6.使用说明 13 7、总结 14 参考文献 15
这是在上的希格斯玻色子机器学习挑战的获胜...重建可执行文件,SBCL(Common Lisp 编译器) 24GiB 内存 大约 4GiB 的磁盘空间 让我们看看为什么需要这些东西。 CUDA 卡和 NVIDIA CUDA Toolkit 是先决条件,因为 dropo
项目总结 在此项目中,我模拟了在各种参数范围(变异率,物种树分支长度,重组率等)下进行基因座内部重组的遗传数据,以便评估汇总合并方法对于违反“无基因座内部重组”假设的鲁棒性。 有关我的项目和可复制脚本...
近年来,随着计算机辅助设计的不断发展,规划设计软件用户迅速扩大,同时广大用户也对软件提出了更高的要求,为此,本公司城市规划专业、建筑专业和计算机专业人员倾力协作,在总结多年从事城市规划专业设计和前版...
《Practical Common Lisp》的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题。他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案。 不管是弱类型或强类型,静态或动态...
《Practical Common Lisp》的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题。他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案。 不管是弱类型或强类型,静态或动态...
如果你使用过haskell, lisp等语言,这个函数式不用解释你也知道是怎么回事了。 如果你是一个老牌的c++/java程序员,那么这里还要稍微解释一下。当然如果您对这些虚头八脑的名词不感兴趣,那么,你尽可以跳过这一章,...
当前/以前的工作总结: 在 Cleartrip Travels [],我是开发航班/酒店搜索/预订系统的后端团队的一员。 我在飞行队。 我和我的导师一起使用 ITA API 在 Common Lisp 中设计和实现了国际航班搜索产品。 我还致力于构建...
Lisp编码和使用约定。 宏中使用的符号标记约定是由Doug Hoyte's中的宏激发的。 下表总结了宏和函数(F / M分别指代函数或宏): 名称 类型 CL堂兄 退货 mapgrid F mapcar 向量 mapg F mapc 第一个参数 mapgrid-ma[-1...
开发了一套基于AutoCAD平台的纸样设计及自动绘制的系统,介绍了以AutoLISP语言作为编程语言和开发工具,归纳了纸样程序中几种典型的数学模型,总结了如何运用ActiveX方法来增强纸样图形的生成,解决了目前服装企业在西装...
否则,您应该等待其他玩家总结自己的举动,然后用自己的行动做出回应。 井字游戏 普通的旧井字游戏。 标志 此游戏不支持任何标志。 要发送您的举动,请在其自己的行上发送“ row col”。 一旦对手采取行动,您将在...