`

Lisp 总结

 
阅读更多

 

基本语法

宏定义
(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的结果)


 

 

 

Schema英文教程 

Racket官方文档--图形介绍

Lisp教程(易百)

Windows下的CLisp和Schema的两个IDE

Lisp动态作用域的例子

Trees as Linked Lists in Common Lisp

 
 
 
 
  • 大小: 5.1 KB
  • 大小: 3.6 KB
分享到:
评论

相关推荐

    ansi common lisp 教程

    新的和更强大的方法教育学生的思考程序,该文本包含一个教程的例子,说明Lisp编程的基本概念,以及ANSI Common Lisp的一个跟上时代的总结,列出每个运营商在语言。信息和乐趣,它给学生提供了他们所需要的一切,开始...

    常用Common LISP函数分类总结.docx

    CAD二次开发lisp教程《第二章》

    二是学会总结,把学习、运用中的心得体会记下来,当成一种经验或者教训加以提炼并在日后的应用中加以改进,一定能提高你对这门编程语言的认识。以下是笔者在学习与运用ASP编程中的两点经验,希望能对大家有所帮助。

    使用vc6开发autoCAD lisp 使用的com组件

    仅此一家,从创建到Lisp调用方法,这方面的资料很少,花了很多时间实现总结,希望能帮助到各位

    LambdaLite:大约 250 行 Common Lisp 的功能性关系数据库

    ” 很难用几句话来总结 Lisp 的所有好处。 但是,LambdaLite 所做的事情在大多数语言中是不可能的。 LambdaLite 的where子句是宏,用于查找以 '/' 为前缀的关键字并将其替换为行属性引用。 结果表达式变成了一个函数...

    正交+对象捕捉的总结

    cad正交以及对象捕捉的总结,很好的cad小技巧

    getchar函数和EOF总结

    大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition)

    结构工具箱

    公司总结的实用结构lisp工具箱,可以自己修改

    rfc6830.zip_RFC6830

    rfc6830 是IETF对现有ip网存在问题总结后提出的LISP解决方案,详细介绍了LISP的功能的优点

    AutoCAD三维圆柱螺旋体程序课程设计

    目录 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

    higgsml:希格斯玻色子机器学习挑战的获胜解决方案

    这是在上的希格斯玻色子机器学习挑战的获胜...重建可执行文件,SBCL(Common Lisp 编译器) 24GiB 内存 大约 4GiB 的磁盘空间 让我们看看为什么需要这些东西。 CUDA 卡和 NVIDIA CUDA Toolkit 是先决条件,因为 dropo

    563-final-project

    项目总结 在此项目中,我模拟了在各种参数范围(变异率,物种树分支长度,重组率等)下进行基因座内部重组的遗传数据,以便评估汇总合并方法对于违反“无基因座内部重组”假设的鲁棒性。 有关我的项目和可复制脚本...

    鸿业城市规划设计CPS6.0

    近年来,随着计算机辅助设计的不断发展,规划设计软件用户迅速扩大,同时广大用户也对软件提出了更高的要求,为此,本公司城市规划专业、建筑专业和计算机专业人员倾力协作,在总结多年从事城市规划专业设计和前版...

    JavaScript设计模式之单例模式实例

    《Practical Common Lisp》的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题。他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案。 不管是弱类型或强类型,静态或动态...

    常用的Javascript设计模式小结

    《Practical Common Lisp》的作者 Peter Seibel 曾说,如果你需要一种模式,那一定是哪里出了问题。他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案。 不管是弱类型或强类型,静态或动态...

    javaparser:基于函数式组合子逻辑的JAVA语言分析框架

    如果你使用过haskell, lisp等语言,这个函数式不用解释你也知道是怎么回事了。 如果你是一个老牌的c++/java程序员,那么这里还要稍微解释一下。当然如果您对这些虚头八脑的名词不感兴趣,那么,你尽可以跳过这一章,...

    航空订票系统java源码-resume:NikhilPrabhakar的简历作为Git时间线

    当前/以前的工作总结: 在 Cleartrip Travels [],我是开发航班/酒店搜索/预订系统的后端团队的一员。 我在飞行队。 我和我的导师一起使用 ITA API 在 Common Lisp 中设计和实现了国际航班搜索产品。 我还致力于构建...

    idl代码与Matlab-map-grid-utils-1:函数和宏,有助于从LiamHealy的antik/grid库中的网格上进行映射

    Lisp编码和使用约定。 宏中使用的符号标记约定是由Doug Hoyte's中的宏激发的。 下表总结了宏和函数(F / M分别指代函数或宏): 名称 类型 CL堂兄 退货 mapgrid F mapcar 向量 mapg F mapc 第一个参数 mapgrid-ma[-1...

    基于AutoCAD二次开发的西装纸样自动绘制的研究 (2010年)

    开发了一套基于AutoCAD平台的纸样设计及自动绘制的系统,介绍了以AutoLISP语言作为编程语言和开发工具,归纳了纸样程序中几种典型的数学模型,总结了如何运用ActiveX方法来增强纸样图形的生成,解决了目前服装企业在西装...

    RCGames:允许AI相互玩游戏的服务器

    否则,您应该等待其他玩家总结自己的举动,然后用自己的行动做出回应。 井字游戏 普通的旧井字游戏。 标志 此游戏不支持任何标志。 要发送您的举动,请在其自己的行上发送“ row col”。 一旦对手采取行动,您将在...

Global site tag (gtag.js) - Google Analytics