讨厌是什么鬼。
能够实现一个解释器,并且能够把代码当作数据就可以元编程。
这样做听上去好像开玩笑,但是在大型编程项目中,却不同程度地广泛存在。因此,有人把它总结出来,起名为"格林斯潘第十定律"(Greenspun's Tenth Rule):
"任何 C 或 Fortran 程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是 bug 的、运行速度很慢的 Common Lisp 实现。"
如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用(a)使用一种强大的语言,(b)为这个难题写一个事实上的解释器,或者(c)你自己变成这个难题的人肉编译器。在 Python 的例子中,这样的处理方法已经开始出现了,我们实际上就是自己写代码,模拟出编译器实现局部变量的功能。
这种实践不仅很普遍,而且已经制度化了。举例来说,在面向对象编程的世界中,我们大量听到"模式"(pattern)这个词,我觉得那些"模式"就是现实中的因素(c),也就是人肉编译器。当我在自己的程序中,发现用到了模式,我觉得这就表明某个地方出错了。程序的形式,应该仅仅反映它所要解决的问题。代码中其他任何外加的形式,都是一个信号,(至少对我来说)表明我对问题的抽象还不够深,也经常提醒我,自己正在手工完成的事情,本应该写代码,通过宏的扩展自动实现。
谢谢。大佬好厉害。
rust 只是刚刚囫囵吞了官网上那本圣经书。弄了个练习.
挺久没有碰 javescript.以为箭头函数内部会默认返回最后的表达式了..(else 最后就没 return ).
是不是因为 return 是个语句. 第一次 return 出来的闭包的时候. 已经 return 过了,执行那个闭包的时候,由于闭包的捕获,在开始的函数还没运行结束并释放. 当闭包返回的时候,已经没有 return 可以用了。
而如果是默认返回最后的表达式的话,是不是就是说, 最早的函数会"恢复"然后,再计算一个返回值。
是不是因为闭包是之前 return 出来的, 最早的 gend 已经"return 过了". 所以当它返回的时候就在右括号旁. (然后那个最早的 gend 又返回了?还是 undifened)
赞👍
原谅我说一句“华而不实”(真香警告。好吧,确实曾经总爱把主题折腾来折腾去得三番五次,基本上一周就会换 1 到 N 次,但结果最后发现还是原生主题最耐看)
js 很多都是后面加入进去的吧。