eq?

用于判断两个符号是不是相同的符号

> (eq? 'a 'a)
#t
> (eq? 'a 'b)
#f
> (eq? 'aa 'aa)
#t
> (eq? 'aac 'aac)
#t

memq

用于检查符号是不是在表中如果在表中就返回这个符号第一次出现的那个子表

> (memq 'a '(a b c))
(a b c)
> (memq 'a '(1 2 a b c))
(a b c)
> (memq 'a '(1 (a b) 2 a b c))
(a b c)

一些常用的判断

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。

赋值与局部状态

set!

用于改变一个符号的值

> (define a 1)
> (set! a (+ 1 a))
> a
2
> (set! a (+ 1 a))
> a
3
> (set! a (+ 1 a))
> a
4

begin

按照顺序求值把最后一个值作为整个begin返回

> (begin 1 2 3 4)
4
> (begin (define a 1) (define b 2) 1)
1
> a
1
> b
2

模拟一个对象系统

> (define (new-a a)
    (let
      ((all 100))
      (lambda (amount)
        (if (>= all amount)
            (begin (set! all (- all amount))
              all)
            (display "ERROR")))))
            
            
> (define a (new-a 1))
> (define b (new-a 2))
> (a 10)
90
> (a 10)
80
> (a 10)
70
> (b 10)
90
> (b 10)
80
> (b 10)
70

set-car与cet-cdr

cons,car 与 cdr是构造序对,
可是不能更改序对,
set-car与set-cdr是更改序对,
改变序对的结构

例:

有代码:

> (define list1 (list 1 2 3 4))
> (define list2 (list 9 8 7))
> list1
(1 2 3 4)
> list2
(9 8 7)
> (set-car! list1 list2)
> list1
((9 8 7) 2 3 4)
> list2
(9 8 7)
> (set-car! list2 0)
> list2
(0 8 7)
> list1
((0 8 7) 2 3 4)
> (set-car! (car list1) 1)
> list1
((1 8 7) 2 3 4)
> list2
(1 8 7)

在代码中
对list2更改数据结构,
在list1中也会同时更改

因为他们是同一个元素

同理

对list1的第一个元素中的数据更改
也会改变list2的数据


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

对表对树 上一篇
作用域 下一篇