setq
和 setf
在 Common Lisp 中都是用于赋值的操作符,但它们有一些重要的区别和适用场景。以下是它们的主要区别:
1. 用法
-
setq
:- 仅用于给变量赋值。
- 语法:
(setq variable value)
- 只支持简单的变量赋值。
(setq my-var 10) ; 将 10 赋值给 my-var
-
setf
:- 用于更广泛的赋值操作,可以赋值给变量、数组元素、结构体字段等。
- 语法:
(setf place value)
-
place
可以是多种类型的赋值目标。
(setf my-var 10) ; 赋值给变量 (setf (aref my-array 0) 5) ; 赋值给数组元素
2. 灵活性
-
setq
:- 只能用于赋值全局或局部变量,适用性较窄。
-
setf
:- 适用于多种数据结构,可以用于更新数组、列表、哈希表、结构体等。
- 更加灵活和通用。
3. 返回值
-
setq
:- 返回赋值后的值。
-
setf
:- 返回赋值后的值。
示例比较
;; 使用 setq
(setq a 10) ; a = 10
(setq b 20) ; b = 20
;; 使用 setf
(setf c 30) ; c = 30
(setf (aref my-array 0) 5) ; 将 my-array 的第一个元素赋值为 5
(setf (car my-list) 'new-value) ; 修改列表的第一个元素
总结
-
setq
适用于简单的变量赋值。 -
setf
更加灵活,适用于多种数据结构和赋值场景。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于