gpt4 book ai didi

emacs - 词法作用域有什么了不起的?

转载 作者:行者123 更新时间:2023-12-01 09:03:47 24 4
gpt4 key购买 nike

我不明白 Emacs 24 的新词法作用域功能为何如此出色的原因是我想不出没有它们就无法实现的任何新功能。例如,下面的闭包:

(setq lexical-binding t)
(defun f1 (num1)
(lambda (num2)
(setq num1 (* num1 num2))))

(fset 'f2 (f1 5))
==> (closure ((num1 . 5) t) (num2) (setq num1 (* num1 num2)))
(f2 5)
==> 25
(f2 2)
==> 50

可以使用常规动态范围来实现,如下所示:

(defun f1 (num)
(let ((tmpvar (make-symbol "num")))
(set tmpvar num)
`(lambda (num2)
(set ',tmpvar (* (eval ,tmpvar) num2)))))

(fset 'f2 (f1 5))
==> (lambda (num2) (set (quote num) (+ (eval num) num2)))
(f2 5)
==> 25
(f2 2)
==> 50
(fset 'f3 (f1 9))
==> (lambda (num2) (set (quote num) (+ (eval num) num2)))
(f3 3)
==> 27
(f3 2)
==> 54
(f2 10)
==> 500

好的,所以并不是所有的语言都有类似于 elisp 的 uninterned 符号的东西,所以我理解为什么词法作用域在他们的情况下如此出色。但是 elisp 呢?由于词法作用域,你能想到我现在(从 Emacs 24 开始)可以做的我以前不能做的事情吗?

最佳答案

你不需要非实习符号,使用 cons 代替 make-symbolcar 代替 evalsetcar 而不是 set 并且您的示例也可以正常工作(并且效率更高)。

还请注意,从机器语言到更高级别的语言的发展主要是基于使越来越多的事情不可能(或至少更难)。当然,那些从程序员那里拿走的设施很少被使用和/或被认为太危险。考虑使用未初始化的变量(在 C 中可能,但在 Java 和许多其他语言中是不可能的),或者跳到指令的中间。

至于您的示例代码的一些缺点:不仅可读性较差,而且编译器基本上无法知道您正在构建代码,因此不允许查看“`( lambda ...)"来编译它,扩展它的宏调用,给你关于可疑元素的警告,......

关于emacs - 词法作用域有什么了不起的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12127128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com