Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 函数式编程中的多个源文件、目录结构和名称空间_Functional Programming_Lisp_Arc Lisp - Fatal编程技术网

Functional programming 函数式编程中的多个源文件、目录结构和名称空间

Functional programming 函数式编程中的多个源文件、目录结构和名称空间,functional-programming,lisp,arc-lisp,Functional Programming,Lisp,Arc Lisp,我很惊讶地看到《黑客新闻》的源代码只是一个包含函数定义的简单列表的大文件。 这是函数式编程的典型特征吗?像在OOP项目中常见的那样,在一个潜在的深层目录结构中有很多短文件,这是不是很少见 FP中的模块与OOP中的名称空间相同吗?不,模块编程在FP中也很常见。模块化的一般原则同样适用 例如,在Haskell中,你可以说 import qualified Parsec as P 这将为您提供命名空间p中的Parsec解析库 模块和名称空间是否“与OOP中的名称空间相同”取决于函数语言和OOP语言

我很惊讶地看到《黑客新闻》的源代码只是一个包含函数定义的简单列表的大文件。

这是函数式编程的典型特征吗?像在OOP项目中常见的那样,在一个潜在的深层目录结构中有很多短文件,这是不是很少见


FP中的模块与OOP中的名称空间相同吗?

不,模块编程在FP中也很常见。模块化的一般原则同样适用

例如,在Haskell中,你可以说

import qualified Parsec as P
这将为您提供命名空间
p
中的Parsec解析库


模块和名称空间是否“与OOP中的名称空间相同”取决于函数语言和OOP语言。(ML模块与其他语言有点不同。)

有许多函数式编程语言(FPL),它们非常不同。Lisp方言(如Scheme、Common Lisp、Logo、Arc等)也是如此。

它们通常不是围绕类(或类似概念)组织的,并且类通常不会与名称空间合并

在一些面向对象的语言中,程序由许多类组成,类层次结构(或类似结构)映射到目录结构,每个类都是一个或多个文件。这导致了由许多文件和IDE组成的软件系统,IDE将这些文件/类作为层次结构进行浏览。(这与最初的Smalltalk不同,Smalltalk的代码由浏览器访问,而不是基于文件检索)

例如,在CommonLisp中,类不是名称空间,方法也不附加到单个类(因为有多个方法)。有一个称为“package”的单独构造,它为Lisp符号提供名称空间。有一个典型的软件系统是由捆绑若干相关功能的文件组成的。通常,更大的功能单元有自己的名称空间

例如,图形工具包可能有几个名称空间:ui后端、ui用户、ui系统、ui绘图、ui动画。ui绘图命名空间可用于多个文件:ui-draw-2d-objects.lisp、ui-draw-3d-objects.lisp、ui-draw-macros.lisp等。单个文件ui-draw-2d-objects.lisp将绑定绘制二维对象(直线、多边形、圆、位图等)所需的所有类、方法和变量

然后,开发系统负责提供导航。但导航通常不是层次化的,而是基于搜索和检索符号。那么文件有多大并不重要。更重要的是,文件要对正确的功能进行分组,并在内部进行组织,以便以某种方式识别相关的功能

例如,如果我想识别所有的矩形绘图函数,我会使用REPL

在LispWorks中,绘图原语位于包“GP”或“GRAPHICS-PORTS”中。然后我可以让LispWorks告诉我包“GP”中包含“draw rect”的所有符号

上面的列表告诉我,这些符号中的每一个都有一个已定义的功能,带有单个冒号的符号是“导出”的

然后我可以使用这些符号来查找更多信息:参数列表、源代码、文档等等。CommonLisp甚至提供了文档、描述和编辑等标准功能


因此,这里的开发不是基于组织到某个类层次结构中的大量小文件,而是作为模块和名称空间的层次结构,每个名称空间捆绑存储在一个或多个文件中的大量功能。IDE负责支持非层次化的浏览和搜索。

实现语言是,这是一个主要的设计目标<代码>新闻.arc包含在arc发行版中,很可能是为了通过将有用的应用程序打包到单个源文件中来演示这种简洁性


这种打包不一定表示函数式编程中的常见做法,尽管正如(+1)所指出的,文件边界在函数式编程环境中通常不那么重要。

我认为2600行的文件在命令式编程中是非常糟糕的做法。在FP中是否更容易接受?如果是,为什么?@Jonatan:这是不可接受的,相信我。我不熟悉黑客新闻所用的Arc语言;也许它没有模块,或者在编写代码时没有模块?@Jonatan:我认为关于HN代码的问题可以这样回答:Paul Graham通常很乐意以一种适合他自己的方式来做事情,尽管它们不会适合绝大多数程序员。我不认为这一特点与FP有任何特别的联系。这里的另一个方面是,HN主要是为了设计和开发Arc而编写的。这是手段,不是目的。(这就是为什么它只为他自己设计的原因:大多数语言,几乎所有体面的语言,都有一个设计师。)我们很少看到年轻的编程语言在开发过程中出现,甚至很少看到用一种语言编写的程序。Guido的Python0.9个人程序可能也不是典型的(或示范性的)Python程序。
CL-USER 10 > (apropos "draw-rect" "GP")
GRAPHICS-PORTS::%DRAW-RECTANGLE (defined)
GRAPHICS-PORTS::DRAW-RECTANGLE-BOUNDS (defined)
GRAPHICS-PORTS::%DRAW-RECTANGLES (defined)
GRAPHICS-PORTS::DRAW-RECTANGLES-BOUNDS (defined)
GRAPHICS-PORTS:DRAW-RECTANGLES (defined)
GRAPHICS-PORTS:DRAW-RECTANGLE (defined)