**Dylan**是多范型的编程语言，包括了支持函数式和面向对象编程（OOP），它是动态和反射式的，却提供了设计用于支持生成高效机器代码的编程模型，包括了在动态和静态行为上的细粒度的控制。它是在1990年代早期由苹果公司领导的群组创造的。

概述
--

在Dylan参考手册中有简明而彻底的语言概述。Dylan派生自Scheme和Common Lisp，并增加了派生自Common Lisp对象系统（CLOS）的集成的对象系统。在Dylan中，所有的值（包括数值、字符、函数和类）都是头等对象。Dylan支持多重继承、多态、多分派、关键字参数（英语：）、对象内省、基于模式的语法扩展宏和很多其他高级特征。程序可以表达在动态性上的细粒度的控制，允许程序占据在动态和静态编程之间的连续区，并支持演进式开发（允许先快速原型随后增进精制和优化）。

Dylan的主要设计目标是成为适合开发商业软件的动态语言。Dylan尝试解决潜在的性能问题，通过向完全灵活性的Lisp系统介入"本性"限制，允许编译器清晰的理解可编译单元比如函数库。Dylan从Scheme和其他Lisp派生出了它的很多语义；某些Dylan实现最初建造在现存Lisp系统之内。但是Dylan有着类似ALGOL的语法而非类似Lisp的前缀语法。

历史
--

更多：Dylan编程语言的历史（英语：）
Dylan是在1990年代早期由苹果公司领导的一个群组创建的。在它开发的时候，它被意图用于Apple Newton计算机，但是Dylan实现那时还没有达到充分成熟，而Newton转而使用了C和Walter Smith开发的NewtonScript二者的混合。Apple在1995年终止了其Dylan开发努力，尽管他们制作了一个可获得的"技术发行"版本（Apple Dylan（英语：） TR1），并包括了一个高级集成开发环境（IDE）。

其他两个小组对语言设计和开发实现做出了贡献：Harlequin公司（英语：）发行了Microsoft Windows下的商业IDE，卡内基·梅隆大学发行了叫作Gwydion Dylan的Unix下的编译器。二者的实现分别于2004年和1998年开放了源代码。Harlequin实现当前叫作Open Dylan并由一组志愿者维护。

Dylan语言的代号是Ralph。James Joaquin选择名字Dylan表示"动态语言"（**Dy**namic **lan**guage）。

语法
--

Dylan的多数语法特征来自它的Lisp传承。Dylan最初使用类似Lisp的前缀语法，它基于了S-表达式。到了语言设计完成的时候，语法被变更为类似ALGOL的语法，预期广泛的编程者受众会更加熟悉它。语法由Michael Kahl设计。它在Dylan参考手册中有详尽描述。

### 词法

Dylan不是大小写敏感的。Dylan的词法允许使用连字暨减号的命名约定，来连接多单词标识符的各部份（有时叫做"lisp-case"或"kebab case"）。这个约定在Lisp语言中是常见的，但不适用于将不是数值文字（英语：）一部份的连字号暨减号，当作一个单一词法记号处理的那些编程语言，即使在它没有包围着空白字符的时候。

除了字母数字字符和连字暨减号之外，Dylan允许特定非字母数字字符作为标识符的一部份。标识符不可以单独的由非字母数字字符或数字字符组成。如果有任何歧义，应使用空白。

### 样例代码

有几个槽的一个简单的类：

```
define class <point> (<object>)
 slot point-x :: <integer>,
 required-init-keyword: x:;
 slot point-y :: <integer>,
 required-init-keyword: y:;
end class <point>;

```

在约定上，类使用尖括号（即小于号和大于号）来命名，比如这个代码例子中的类名字`<point>`。

在`end class <point>`中，`class`和`<point>`二者都是可选的。对所有`end`子句都是如此。例如，可以写`end if`或只写`end`来终止一个`if`语句。

同样的类，可以用极小化方式重写为：

```
define class <point> (<object>)
 slot point-x;
 slot point-y;
end;

```

槽现在都确定类型为`<object>`。槽必须被手动初始化。

在约定上，常量名字开始于`$`：

```
define constant $pi :: <double-float> = 3.1415927d0;

```

阶乘函数：

```
define method factorial (n :: <integer>) => (n! :: <integer>)
 case
 n < 0 => error("Can't take factorial of negative integer: %d\n", n);
 n = 0 => 1;
 otherwise => n \* factorial(n - 1);
 end
end;

```

这里的`n!`和`<integer>`就是正常的标识符。

这里没有显式的返回语句。一个方法或函数的结果是最后求值的那个表达式。除掉在返回位置上的表达式后面的分号是常见的风格。

模块与命名空间
-------

在很多面向对象语言中，类是封装和模块化的主要方式；每个类定义一个名字空间并控制哪些定义是在外部可见的。进一步的，在很多语言中类定义必须被用作一个整体的不可见单元。例如，使用`String`串接函数要求导入并编译全部的`String`。

某些语言包括Dylan，还包括一个分立的显式的命名空间或模块系统，可以用更一般性的方式进行封装。

在Dylan中，编译单元和导入单元的概念是分开的，类对于二者都没有什么特殊可以言。"库"定义应当被一起编译和处理的项目，而"模块"定义一个命名空间。类可以一起放置在模块中，或分拆至其中，随编程者意愿。经常是一个类的完全定义不存在于一个单一的模块中，而是延展于进行选择性收集的多个模块至上。不同的程序可以有相同的类的不同的定义，并只包括它们所需要的。

例如，考虑支持`String`的一个附加库regex。在某些语言中，一个功能要被包括在字符串中，这个功能就必须被增加到`String`命名空间。随着这种事情不断发生，`String`类变得越来越大，而不需要使用regex的函数仍必须为增加了库大小付出代价。为此，这种附加件典型的放置在它们自己的命名空间和对象之中。这种方式的缺点是新函数不再是`String`的一部份；它转而被隔离在单独声明的它自己的函数集合之中。不再使用`myString.parseWith(myPattern)`，从OO视角这是自然的组织方式，而是使用像 `myPattern.parseString(myString)`这样的东西，它在效果上反转了次序。

在Dylan之下，可以为相同代码定义很多接口，例如`String`串接方法可以给放置在`String`接口和`concat`接口二者之中，后者将不同的类中的不同的串接函数收集在一起。这常用于数学库中，这里的函数意图适用于广泛的不同对象类型。

接口构造的更实际用法是建造一个模块的公开和私有版本，在其他语言中这被包括为一个附带特征，并总是导致问题并增加语法。在Dylan之下，所有的函数调用可以简单的放置在"私有"或"开发"接口中，而把可公开访问的函数收集在`Public`接口之中。在Java或C++之下，一个对象的可见性是定义在代码中的，意味着要提供类似的变更，编程者将被强制的去完全重写定义，并且不能同时有两个版本。

类
-

在Dylan中以类似于大多数OO语言的风格，类描述了对象的`slot`（槽，数据成员，字段，ivar等）。 所有对槽的访问都要通过方法，就像Smalltalk那样。缺省的`getter`和`setter`方法基于槽名字而自动生成。对比于多数其他OO语言，可应用于类的其他方法经常定义于这个类的外部，因此在Dylan中类定义典型的只包括存储的定义。例如：

```
define class <window> (<view>)
 slot title :: <string> = "untitled", init-keyword: title:;
 slot position :: <point>, required-init-keyword: position:;
end class;

```

在这个例子中，定义了类`<window>`。`<类名字>`语法只是约定，使得类名字显得突出，尖括号只是这个类名字的一部份。与之相对比，在一些语言中，约定为大写类名字的首字母，或给名字前缀上C或T（举个例子）。`<window>`继承了一个单一类`<view>`，并包含二个槽：`title`持有这个窗口标题的字符串，和`position`持有这个窗口一角的X-Y点。在这个例子中，标题给出为缺省值，而位置还没有值。可选的`init-keyword`语法允许编程者在初始化这个类的对象时指定这个槽的初始值。

在语言比如C++或Java中，类还定义了它的接口。所以在这二种语言中，如果像上述案例中，类定义没有显式的对可见性的指令，则对数据成员和方法的访问都被当作是`protected`，意味着它们只能被子类使用。要使得无关代码使用这个窗口的实例，它们必须给声明为`public`。

在Dylan中，这些槽的可见性规则不被当作这个代码的一部份，而是模块/接口系统的一部份。这增加了相当大的灵活性。例如，在早期开发中用的接口可以声明所有东西为`public`，而用在测试和部署中用的接口会加以限制。对于C++或Java，这种变更会需要改变源代码，所有人们就不做了，而在Dylan中，这是完全无关的概念。

尽管这个例子没有用到，Dylan还支持多重继承。

方法和泛化函数
-------

在Dylan中，方法不是固有的关联于任何特定的类；方法可以被认为存在于这个类之外。就像CLOS，Dylan是基于多分派（多方法）的，这里特定方法的调用是基于它的所有实际参数的类型来选择的。方法不需要在编译时间就知道，基于用户的偏好，所要求的函数可以是能获得到的也可以不能。

在Java之下，相同的方法被隔离在特定的类之中。要使用这个功能，编程者被强制去`import`这个类并显式的引用它来调用这个方法。如果这个类不可获得，或在编译时间未知，这个应用简单的不能编译。

在Dylan中，泛化函数表示零或多个类似的方法，用`define method`方式创建的所有方法自动的包含在同名的泛化函数之内。泛化函数也可以显式的用`define generic`声明，允许编程者精确控制可以增加哪种方法。代码被隔离于存储而位于泛化函数中。很多类在其中拥有它们自己的方法，因此在感官上就像多数其他OO语言一样。但是代码实际上位于泛化函数之中，意味着它们不附属于特定的类，并可以被任何人自然的调用。下例将类`<window>`的方法`turn-blue`并入同名的泛化函数之内：

```
define method turn-blue (w :: <window>)
 w.color := $blue;
end method;

```

这个定义类似于其他语言的定义，并有可能被封装到`<window>`类之中。注意`:=`这个`setter`调用，它是`color-setter($blue, w)`的语法糖。

泛化函数的自主利用可见于更泛化的例子之中。例如，在多数语言中的一个常见函数`to-string`，它返回这个对象的某种人类可读形式。比如说一个窗口可能返回它的标题和它在父窗口中的位置，而一个字符串将返回它自身。在Dylan中，这些方法可以给收集到叫作`to-string`的一个单一模块中，因而这个代码被从这个类自身的定义中移除。如果一个特定对象不支持`to-string`，可以简单的在`to-string`模块中增加上它。

扩展性
---

上述的整体概念可能让读者觉得很奇怪。处理一个窗口的`to-string`不定义在`<window>`之中。除非考虑到Dylan对`to-string`调用的处理方式，否则就可能变得没有意义。在多数语言中，在程序编译的时候，查找给`<window>`的`to-string`并把它替代为到这个方法的一个指针（或多或少）。在Dylan中，这发生在程序初次运行的时候，运行时系统建造一个方法名字/形式参数细节的表格，并通过这个表格来动态的查找方法。这意味着一个特定方法可以位于任何地方，不只是在编译时间单元中。最后编程者得到了在放置其代码上的相当大的灵活性，只要合适，可以收集在它的类之中，也可以与相同功能的方法收集在泛化函数中。

这里隐含着编程者可以通过在单独文件中定义函数，来向现存的类增加功能。例如人们可能希望向所有`<string>`增加拼写检查，这在多数语言中将需要访问到字符串类的源代码，而这种基本类很少以源代码形式给出。在Dylan（和其他可扩展语言）中，拼写检查方法可以增加到`spell-check`模块中，通过`define method`构造定义它可以适用的所有的类。在这种情况下，实际功能可以定义在一个单一的泛化函数中，它接受一个字符串并返回错误。当`spell-check`模块被编译入程序的时候，所有字符串（和其他对象）都会得到这个增加的功能。

引用
--

1. ↑  Stokel-Walker, Chris.. Increment. Stripe.  [23 August 2020]. （原始内容存档于2020-11-09）.
2. 1 2 3  Andrew Shalit; David Moon; Orca Starbuck.. Apple Press. Addison-Wesley. 11 September 1996  [2021-03-13]. ISBN 9780201442113. （原始内容存档于2021-05-30）.

外部链接
----

* 官方网站, Open Dylan – hosts open source, optimizing Dylan compiler targeting Unix/Linux, macOS, Microsoft Windows
* Overview of the language （页面存档备份，存于）
* An Introduction to Dylan （页面存档备份，存于）
* Apple Dylan TR1
* The Marlais Dylan Interpreter （页面存档备份，存于） – An implementation of a subset of Dylan, suitable for bootstrapping a compiler
* 中的"Dylan"

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
Lisp编程语言 |
| --- |
|  |
| 特征 | 

|  |  |
| --- | --- |
|   | 
* 自动存储管理
* 条件
* 动态类型
* 高阶函数
* 链表
* M-表达式（英语：）（弃用）
* 读取﹣求值﹣输出循环
* 递归
* S-表达式
* 自主（英语：）编译器
* 树数据结构

 |
|  |
| 对象系统 | 
* Common Lisp对象系统（CLOS）
* CommonLoops（英语：）
* Flavors（英语：）

 |

 |
|  |
| 实现（英语：） | 

|  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 标准化 | 

|  |  |
| --- | --- |
| CommonLisp | 
* Allegro Common Lisp（英语：）
* Armed Bear Common Lisp（英语：）（ABCL）
* CLISP
* Clozure CL
* CMU Common Lisp（CMUCL）
* Corman Common Lisp（英语：）
* Embeddable Common Lisp（ECL）
* GNU Common Lisp（GCL）
* LispWorks（英语：）
* Macintosh Common Lisp（英语：）
* Mocl（英语：）
* Poplog（英语：）
* Steel Bank Common Lisp（SBCL）
* Symbolics Common Lisp（英语：）

 |
|  |
| Scheme | 
* Bigloo（英语：）
* Chez Scheme
* Chicken
* Gambit
* Gauche（英语：）
* GNU Guile
* Ikarus（英语：）
* IronScheme（英语：）
* JScheme
* Kawa（英语：）
* Larceny
* MIT/GNU Scheme
* Racket
* RScheme（英语：）
* Scheme 48
* SCM
* SIOD
* STklos（英语：）
* TinyScheme
* Ypsilon（英语：）

 |
|  |
| ISLISP | 
* OpenLisp（英语：）
* Easy-ISLisp

 |

 |
|  |
| 未标准化 | 

|  |  |
| --- | --- |
|   | 
* Arc
* AutoLISP
* BBN LISP
* Clojure
* Dylan
* Emacs Lisp
* EuLisp（英语：）
* Franz Lisp
* GOAL（英语：）
* Hy
* Interlisp（英语：）
* 知识工程环境（英语：）
* LispKit
* \*Lisp（英语：）
* Le Lisp
* LFE（英语：）
* Lisp Machine Lisp（英语：）
* Maclisp
* MDL（英语：）
* MLisp（英语：）
* MultiLisp（英语：）
* newLISP
* NIL（英语：）
* PC-LISP（英语：）
* PicoLisp
* Portable Standard Lisp（英语：）
* RPL（英语：）
* S-1 Lisp（英语：）
* SKILL
* Spice Lisp（英语：）
* T（英语：）
* Zetalisp（英语：）

 |
|  |
| Logo | 
* MSWLogo（英语：）
* NetLogo
* StarLogo（英语：）
* UCBLogo（英语：）

 |

 |
|  |
| 操作系统 | 
* Common Lisp界面管理器（英语：）
* McCLIM（英语：）
* Genera（英语：）
* Scsh（英语：）

 |
|  |
| 硬件 | 
* Lisp机器
* TI Explorer（英语：）
* Space-cadet键盘（英语：）

 |

 |
|  |
| 实践社群 | 

|  |  |
| --- | --- |
| 技术标准 | 
* Scheme实现要求（英语：）
* Common Lisp HyperSpec（英语：）
* X3J13（英语：）

 |
|  |
| 教育 | 

|  |  |
| --- | --- |
| 图书 | 
* Common Lisp语言（英语：）
* 如何设计程序（HtDP）
* On Lisp（英语：）
* Practical Common Lisp（英语：）
* 计算机程序的构造和解释（SICP）

 |
|  |
| 教程 | 
* ProgramByDesign（英语：）

 |

 |
|  |
| 组织 | 

|  |  |
| --- | --- |
| 商业 | 
* 苹果公司
* BBN
* Harlequin（英语：）
* Lucid Inc.（英语：）
* Symbolics（英语：）
* Xanalys（英语：）

 |
|  |
| 教育 | 
* 麻省理工学院
	+ MIT计算机科学与人工智能实验室
* 斯坦福人工智能实验室（英语：）
* 加利福尼亚大学伯克利分校

 |

 |
|  |
| 人士 | 

|  |  |
| --- | --- |
|   | 
* Edmund Berkeley（英语：）
* Daniel G. Bobrow（英语：）
* Peter Deutsch
* Phyllis Fox（英语：）
* Paul Graham
* Richard Greenblatt
* Louis Hodes（英语：）
* David Luckham（英语：）
* John McCarthy
* Robert Tappan Morris
* Joel Moses（英语：）
* David Park（英语：）
* Steve Russell
* Richard Stallman

 |
|  |
| CommonLisp | 
* Scott Fahlman（英语：）
* Richard P. Gabriel（英语：）
* Philip Greenspun（英语：）
	+ 第十定律
* David A. Moon（英语：）
* Kent Pitman（英语：）
* Guy L. Steele Jr.
* Daniel Weinreb（英语：）

 |
|  |
| Scheme | 
* Hal Abelson
* William Clinger（英语：）
* R. Kent Dybvig
* Matthias Felleisen
* Robert Bruce Findler（英语：）
* Matthew Flatt（英语：）
* Shriram Krishnamurthi（英语：）
* Guy L. Steele Jr.
* Gerald Jay Sussman

 |
|  |
| Logo | 
* Denison Bollay（英语：）
* Wally Feurzeig（英语：）
* Brian Harvey
* Seymour Papert
* Mitchel Resnick
* Cynthia Solomon（英语：）

 |

 |

 |
|  |
| 
* 分类 **语言**
* 分类 **家族**
* 列表级条目 **列表（英语：）**

 |

 |



|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
程序设计语言 |
| --- |
|  |
| 按范型 | 

|  |  |
| --- | --- |
| 过程式 | 
* FORTRAN
* COBOL
* ALGOL 60
* BASIC
	+ QB64（英语：）
* PL/I
* MUMPS（英语：）
* ALGOL 68
* Forth
* Pascal
	+ Turbo Pascal
* C
* Modula-2
* Ada 83
* occam
* Oberon
* Go
* Zig
* Carbon

 |
|  |
| 面向对象 | 
* Simula 67
* Smalltalk
* C++
* Objective-C
* Eiffel
* Object Pascal
	+ Delphi
* Self
* CLOS
* Visual Basic
	+ Gambas
* Ada 95
* Java
* C#
	+ Vala
* Fantom（英语：）
* Crystal（英语：）

 |
|  |
| 多范型 | 
* Modula-3
* Dylan
* Python
* Lua
* JavaScript
* Ruby
* D
* Factor
* Scala
* F#
	+ F\*
* Haxe
* Dafny（英语：）
* Nim
* Rust
* Dart
* Julia
* Swift
* Ballerina（英语：）
* Bosque（英语：）

 |
|  |
| 函数式 | 

|  |
| --- |
| 
* LISP
	+ Scheme
	+ Common Lisp
	+ Clojure
* Logo
* APL/J
* ML
	+ Standard ML
	+ OCaml
* Erlang
	+ Elixir
* Haskell
	+ Curry
* SAC
* Agda
* Idris
* Pure（英语：）
* jq（英语：）
* Cuneiform

 |

 |
|  |
| 逻辑式 | 
* Prolog
* Datalog
* Mercury
* AnsProlog

 |

 |
|  |
| 脚本语言 | 

|  |  |
| --- | --- |
| 动态语言 | 
* SNOBOL
* Icon
* REXX
* Perl
	+ Raku
* Tcl/Tk
* CLOS
* newLISP
* Python
* Lua
* Ruby
* PHP
	+ Hack
* REBOL
	+ Red（英语：）
* Io
* Julia

 |
|  |
| Shell语言 | 
* Unix shell
	+ sh
	+ csh/tcsh
	+ ksh
	+ bash
	+ ash
	+ zsh
	+ fish
* sed
* AWK
* PowerShell

 |
|  |
| ECMA-262 | 
* ECMAScript
	+ JavaScript
	+ Node.js/Deno
* CoffeeScript/LiveScript（英语：）
* TypeScript
* Elm
* PureScript
* Reason

 |

 |
|  |
| 特定平台 | 

|  |  |
| --- | --- |
| .NET | 
* C#
* C++/CLI
* F#
* PowerShell
* VB.NET
* Small Basic

 |
|  |
| JVM | 
* Java
	+ AspectJ（英语：）
* Scala
* Clojure
* Groovy
* Kotlin

 |

 |
|  |
| 特定领域 | 

|  |  |
| --- | --- |
| 科学计算 | 
* Speakeasy（英语：）
* IDL
	+ GDL
* Maxima
* Maple
* MATLAB
	+ Octave
	+ Scilab
* Wolfram
* R
* Yorick（英语：）
* SageMath
* Julia

 |
|  |
| GPU计算 | 
* GLSL
* HLSL
* OpenCL
* CUDA
* Futhark

 |
|  |
| 数据查询 | 
* SQL
	+ PL/SQL
	+ T-SQL
	+ SQL/PSM（英语：）
* xBase（英语：）
* XPath
* XQuery（英语：）
* GraphQL

 |
|  |
| 可视化 | 
* Simulink
* LabVIEW
* Orange（英语：）
* KNIME（英语：）
* Scratch
	+ Snap!
* Power Fx

 |
|  |
| 传媒设计 | 
* SuperCollider
* Pure Data
* Processing
* ChucK

 |

 |
|  |
| 其它 | 
* 汇编语言
* make
* PostScript
* XSLT
* WebAssembly

 |
|  |
| 
* 分类 目录
* 列表级条目 列表
* 历史
* 比较（英语：）
* 时间线（英语：）

 |

 |