• 能够实现一个解释器,并且能够把代码当作数据就可以元编程。

  • 这样做听上去好像开玩笑,但是在大型编程项目中,却不同程度地广泛存在。因此,有人把它总结出来,起名为"格林斯潘第十定律"(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 很多都是后面加入进去的吧。