setq 和 setf 的区别

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​ 更加灵活,适用于多种数据结构和赋值场景。
  • 待分类

    用户发帖时如果不填标签,则默认加上“待分类”。这样做是为了减少用户发帖的负担,同时也减少运营维护的工作量。具有帖子更新权限的用户可以帮助社区进行帖子整理,让大家可以更方便地找到所需内容。这里是关于这样设计的一些思考,欢迎讨论。

    22 引用 • -279 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...