Emacs的setf真厉害

我学Emacs Lisp比较随意 这是少数几个让我眼前一亮的特性 立马记录下来

Emacs的setf很厉害 不信的话你可以看一下大神写的介绍 简单用大神讲解的例子演示一下它和正常的setq的不同

1
2
(let ((world "world"))
(setf (substring world 2 4) "o"))

这里实现了对字符串的替换 被替换的内容就是(substring world 2 4)执行的结果 也就是说 第一个参数指定的内容(也可以是个符号的参考也可以是一个普通符号)会被第二个参数的值替代 换句话说setf是更为通用的setq

上面的例子启发了我 因为就在今天 有人问 如何把buffer里面从start到end的内容替换为某个字符串

在不知道setf以前我的写法是这个样子的

1
2
3
4
(progn
(goto-char 4)
(delete-region 4 8)
(insert "Emacs Rules!"))

如果用setf是这样的

1
(setf (buffer-substring 4 8) "Emacs Rules!")

实现的功能是一样的 都是在scratch里替换This为"Emacs Rules!" 哪个好?

Update:

之前以为这个和function cell有关 是错的 那个是fset 这俩名字太类似了 容易把人搞糊涂