作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不明白 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-symbol
,car
代替 eval
和 setcar
而不是 set
并且您的示例也可以正常工作(并且效率更高)。
还请注意,从机器语言到更高级别的语言的发展主要是基于使越来越多的事情不可能(或至少更难)。当然,那些从程序员那里拿走的设施很少被使用和/或被认为太危险。考虑使用未初始化的变量(在 C 中可能,但在 Java 和许多其他语言中是不可能的),或者跳到指令的中间。
至于您的示例代码的一些缺点:不仅可读性较差,而且编译器基本上无法知道您正在构建代码,因此不允许查看“`( lambda ...)"来编译它,扩展它的宏调用,给你关于可疑元素的警告,......
关于emacs - 词法作用域有什么了不起的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12127128/
我是一名优秀的程序员,十分优秀!