setq & setf

功能

这两个函数其实是一个,只是逻辑上用在不同的场合。

setq用于给symbol的reference设置,而setf用于设置list 或者 array的reference.


setq的使用

setq比较简单,避免了在使用set的时候用‘来阻止表达式求值。

> (setq x "hello")
"hello"
> x
"hello"

setf的使用

> (setq L '(a b (c d) e f g))
(a b (c d) e f g)
> L
(a b (c d) e f g)
> (setf (L 1) 'B)
B
> L
(a B (c d) e f g)
> (L 1)
B
> 
setf用于设置list或者array的reference,上面的例子首先用setq设置了L, 其值是一个list

然后用setf 将B symbol赋给了L的第二个元素b

因为B是一个symbol,我们可以对它赋值,看下面的代码:

> (setq B "He")
"He"
> (L 1)
B
> (eval (L 1))
"He"
> 
用eval将B的值取出来。

setf的复杂应用

下面这个例子来自官方文档:

(define (double x) (+ x x))
→ (lambda (x) (+ x x))
    
(first double) → (x)
(last double)  → (+ x x)
    
; make a fuzzy double
(setf (nth 1 double) '(mul (normal x (div x 10)) 2))
    
(double 10) → 20.31445313
(double 10) → 19.60351563
 

首先定义了一个lambda表达式。

然后用setf把lambda表达式的body,也就是第二个元素设置成了list (mul (normal x (div x 10)) 2)

这个list用来计算随机数,并和2相乘。


这个例子演示了再define之后也可以通过setf来修改lambda表达式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值