似乎有时功能程序中的代码接受其他代码(函数)作为参数并修改它并将其返回执行。它看起来类似于自修改代码。这是否意味着功能程序的紧凑性源于允许极其紧凑的自修改程序的相同原因?
答案 0 :(得分:1)
Ernest Friedman-Hill可能是正确的,这个问题不属于这里,但这里有一个答案:
我会说:不。
语言可以通过多种方式允许自修改代码。最灵活的方法是能够在内存中的任意位置翻转任意位。 (这是一个经典故事:The Story of Mel。)但是,自我修改方法不需要表现出如此危险的自由。在Common Lisp中,编写构造Lisp代码并对其进行求值的代码很容易,但这一切都在Lisp的约束下,并且它不一定更紧凑。在Java中,您可以使用反射进行某些类型的“自我修改”,但这通常比常规Java使用更加冗长。
另外,请记住,在某些面向对象的方法和函数式编程方法之间实际上存在一条细线。两者都允许您将可执行文件和数据打包在一起。 OO通过将方法附加到对象来实现它,而功能语言通过使用闭包来捕获数据来实现它。因此,如果函数式语言是自修改的,那么Java也是如此。但Java通常不被认为是一种自修改语言(反射除外),Java代码通常很冗长。 (顺便说一下,Java的设计师之一Guy Steele也是设计Lisp方言Scheme的人之一 - 一种比Common Lisp更纯粹的功能语言 - 以便尝试面向对象的编程!我相信这个想法是使用闭包来构造不同的面向对象的语言结构。)
警告:我有一段时间没有做过任何硬核Java编程,并且可能有与此问题相关的语言功能,我不知道。