`

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
分享到:
评论

相关推荐

    测量LISP程序.rar

    总结来说,这个“测量LISP程序.rar”压缩包提供了CAD领域的几个核心功能,包括点的展绘、线型自定义、填充符号的创建、独立地物的绘制以及半比例符号的实现。这些LISP程序对于测绘和CAD专业的学生或从业人员来说,是...

    Lisp的本质学习思考

    因此,本文尝试从初学者的角度,总结了学习 Lisp 的经验和体会,旨在帮助读者更好地理解 Lisp 的本质。 首先,作者回忆了自己初次接触 Lisp 的经历,感到困惑和沮丧,因为空括号和奇怪的语法让人难以理解。然而,...

    AutoCAD® .NET 与lisp互相调用

    ## 总结 这篇文档呈现了如何将.NET编程语言的强大功能与AutoCAD平台的悠久历史——AutoLISP编程语言相结合。通过.NET,开发者可以构建强大的应用程序,而借助LispFunction属性,这些程序可以与已有的LISP代码无缝...

    lisp简明教程

    #### 五、总结 Lisp语言虽然历史悠久,但其设计理念和核心特性至今仍对现代编程语言和技术产生着深远的影响。对于希望深入了解编程语言原理和设计原则的学习者来说,Lisp不仅是一门值得学习的语言,更是一扇通往...

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

    在 Common Lisp 中,数据结构的访问和处理是编程的基础,涉及到各种函数,这些函数用于创建、检查、修改和操作Lisp的数据结构。本篇将详细阐述一些常用的Lisp函数,以便于理解和应用。 1. 数据结构的访问和处理函数...

    Lisp函数参考大全中文版

    #### 五、总结 《Lisp函数参考大全中文版》不仅是一本技术手册,更是AutoCAD二次开发者的重要指南。它不仅详细介绍了Lisp语言的基础知识和核心函数,还提供了丰富的实例和应用场景,对于提高开发效率和提升软件功能...

    VISUAL LISP™教程

    总结来说,Visual LISP™教程不仅仅是一门编程语言的课程,它更是一门能够让工程师和设计师通过编程大幅提升工作效率、实现个性化的CAD绘图定制能力的专业教程。学习Visual LISP™,可以让使用者在使用CAD软件时更加...

    ansi common lisp 教程

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

    On_Lisp中文版.pdf

    在入门级Lisp书籍中,宏往往被简单概述,但本书专注于宏的高级用法,并试图总结所有关于宏的知识,这些知识在过去往往是通过经验积累获得的。 《On_Lisp》一书还探讨了Lisp与其他编程语言的不同之处,解释了为什么...

    ANSI Common Lisp 中文版

    - 总结了Common Lisp标准自发布以来经历的主要变化。 - 帮助读者了解当前版本与早期版本之间的差异。 22. **附录D:语言参考笔记**: - 提供了一份详尽的语言参考手册。 - 涵盖了所有内置函数、关键字以及其他...

    AutoCAD_LISP操作数据库方法.doc

    五、总结 AutoCAD LISP 操作数据库方法提供了一种灵活和强大的方式来操作数据库,包括连接数据库、执行查询、插入、更新和删除操作等。通过使用 AutoCAD LISP,可以实现对数据库的自动化操作,提高工作效率和准确性...

    lisp结构设计工具箱

    总结来说,"LISP结构设计工具箱"是一个针对LISP程序员的强大资源,它结合了大师的智慧和经验,为二次开发提供了便利。通过学习和使用这些工具,开发者不仅可以提高工作效率,也能深入了解LISP语言的精髓,提升自身的...

    lisp 软件教程

    **LISP软件教程** ...总结来说,LISP是一门值得探索的编程语言,它提供的不仅仅是语法和工具,更是一种思考问题和解决问题的方式。通过这个详细的LISP教程,初学者可以逐步掌握这门语言,打开通往AI世界的大门。

    lisp基础教程

    - **附录内容**:包括了如何调试程序的指南、Common Lisp操作符的源程序、ANSI Common Lisp与其他Lisp版本的区别总结等。 - **代码下载**:本书中提供的所有示例代码均可在网上免费获取。 - **外部资源**:推荐了...

    CAD中常用的Lisp程序收集

    总结起来,"CAD中常用的Lisp程序收集"是CAD设计者的重要工具箱,它包含了一系列实用的脚本,可以帮助用户更高效地进行设计工作,提升工作效率。通过深入学习和实践Lisp,CAD用户能够进一步优化他们的设计流程,实现...

    比较专业,全面的Visual Lisp 开发人员手册

    #### 四、总结 《比较专业,全面的Visual Lisp 开发人员手册》通过一系列具体实例,详细介绍了Visual Lisp与AutoCAD环境下ActiveX组件的集成方式,涵盖了从基本的实体操作到复杂的异常处理等多个方面。对于希望在...

    Lisp-music-player.rar_autolisp_autolisp程序_lisp_player

    总结一下,这个项目涉及到了以下几个关键知识点: 1. **Lisp编程**:一种历史悠久的函数式编程语言,以其独特的括号语法和高阶函数著名。 2. **Autolisp**:AutoCAD的内置脚本语言,用于自动化绘图和设计任务。 3. ...

    AUTOLISP基础学习教程

    7. **第12章**:最后,通常会有一个总结或实践部分,指导学习者如何将所学应用于实际项目,可能包括编写完整的小型程序示例,以及解决常见问题的技巧和策略。 通过这份教程,初学者不仅可以理解LISP的基本原理,还...

Global site tag (gtag.js) - Google Analytics