What is the difference between "set", "setq", and "setf" in Common Lisp?

解决方案

Originally, in Lisp, there were no lexical variables -- only dynamic ones. And

there was no SETQ or SETF, just the SET function.

What is now written as:

(setf (symbol-value '*foo*) 42)

was written as:

(set (quote *foo*) 42)

which was eventually abbreviavated to SETQ (SET Quoted):

(setq *foo* 42)

Then lexical variables happened, and SETQ came to be used for assignment to them too -- so it was no longer a simple wrapper around SET.

Later, someone invented SETF (SET Field) as a generic way of assigning values to data structures, to mirror the l-values of other languages:

x.car := 42;

would be written as

(setf (car x) 42)

For symmetry and generality, SETF also provided the functionality of SETQ. At this point it would have been correct to say that SETQ was a Low-level primitive, and SETF a high-level operation.

Then symbol macros happened. So that symbol macros could work transparently, it was realized that SETQ would have to act like SETF if the "variable" being assigned to was really a symbol macro:

(defvar *hidden* (cons 42 42))

(define-symbol-macro foo (car *hidden*))

foo => 42

(setq foo 13)

foo => 13

*hidden* => (13 . 42)

So we arrive in the present day: SET and SETQ are atrophied remains of older dialects, and will probably be booted from eventual successors of Common Lisp.

setq 常驻内存lisp_常见Lisp中的set,setq和setf之间的区别?相关推荐

  1. IO多路复用中select、poll、epoll之间的区别

    本文来说下IO多路复用中select.poll.epoll之间的区别 文章目录 什么是IO多路复用 为什么有IO多路复用机制 同步阻塞(BIO) 同步非阻塞(NIO) IO多路复用(现在的做法) 3种 ...

  2. SQL Server中唯一索引和唯一约束之间的区别

    This article gives you an overview of Unique Constraints in SQL and also the Unique SQL Server index ...

  3. 解析java中方法的重载和重写之间的区别与联系

    解析java中方法的重载和重写之间的区别与联系 1 不同点 1.1 方法重写是在不同的类中(父子类),方法重载是在同一类中 1.2 方法重载最初的目的是构造方法的多样化,方法重写的目的是让重写的方法满 ...

  4. Java Persistence API中的FetchType LAZY和EAGER之间的区别?

    我是Java Persistence API和Hibernate的新手. Java Persistence API中的FetchType.LAZY和FetchType.EAGER什么区别? #1楼 我 ...

  5. .NET中小数,浮点数和双精度之间的区别?

    .NET中的decimal , float和double float什么区别? 有人什么时候会使用其中之一? #1楼 对我来说,这是一个有趣的话题,因为今天,我们遇到了一个讨厌的小错误,涉及到deci ...

  6. Hibernate中保存与持久性以及saveOrUpdate之间的区别

    保存与保存或更新与持久保存在Hibernate中 save和saveOrUpdate之间的区别是什么或save和persist之间的区别是任何Hibernate面试中常见的面试问题,就像Hiberna ...

  7. Vue中computed、methods和watch之间的区别

    对于那些开始学习Vue的人来说,对于方法.计算属性和观察者之间的区别有点混淆. 尽管通常可以使用它们中的每一个来完成或多或少相同的事情,但了解每个人在哪里胜过其他人还是很重要的. 在这个快速提示中,我 ...

  8. 计算机关闭和注销的区别,你可知道windows系统中注销、关机、休眠之间的区别吗...

    我们在日常的使用计算机中,如果你有足够细心的话,也许你会好奇当你想关闭计算机的时候,注销.关机.睡眠这3者之间的区别是什么呢?我们在操作电脑的时候,会通过关机.注销.休眠等各种方式来让电脑停止工作.但 ...

  9. Scala中Unit、Nothing和Null之间的区别概述

    在Scala中,Unit.Nothing和Null是三个比较特殊的数据类型,三者之间的区别如下: Unit 类似于Java中的void,表示没有返回值,用于不返回任何结果的方法的结果类型. 只有一个实 ...

最新文章

  1. python集合(set)+常见方法+交叉并补
  2. PECL 和 PEAR 有什么区别?
  3. 2003DC 升级到2008R2 DC实验
  4. GridView中TextBox 有内容,选中当前行CheckBox
  5. 斯坦福大学CS224d基础1:线性代数回顾 Linear Algebra - review
  6. c++ 多重背包状态转移方程_【模板】各种背包问题amp;讲解
  7. 用PHP实现POP3邮件的收取(一)
  8. Flash播放控件属性详解
  9. Incorrect string value: '/xE7/xA8/x8B/xE5/xBA/x8F...' for column 'course' at row 1
  10. Python基础笔记(一)数据类型、变量、字符串
  11. 【距离GDOI:136天】 后缀数组中...
  12. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_11-webpack研究-npm和cnpm安装配置...
  13. Python的视频分析
  14. 金融工程第十一章BSM模型复习
  15. 五大领域总目标指南_幼儿园五大领域总目标
  16. Windows XP SP3英文版镜像
  17. iOS非常全的三方库、插件、大牛博客
  18. python 用cx_Freeze打包程序详细解读setup.py
  19. rockchip 网络adb使用_R1通过adb shell命令查看软件版本号
  20. 支付宝第三方支付接口java调用详细文档

热门文章

  1. 起底商汤校招需求TOP 10岗位 | 智慧城市事业群空宣来了~~
  2. 计算未来轻沙龙 | 当深度学习遇上归纳推理,图神经网络有多强大?
  3. “Paper + Code”加量豪华套餐 | PaperDaily #04
  4. 飞桨第六课 2020.4.5
  5. python 中的理解x[:]
  6. java处理最后一周_Java获取某年某周的最后一天
  7. pcb地线应该不应该做成环路_PCB制板的基础知识,你都学会了吗?(中)
  8. 时间戳类型的字符串 {Timestamp@15601} “2021-07-14 18:56:53.0“ 变成带T的Object类型 2021-07-14T10:56:53.000+0000 处理
  9. log4j监控mybatis的普通配置
  10. OGNL中#和%的用法