Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Dylan (programming language)

From Wikipedia, the free encyclopedia
Multi-paradigm programming language
icon
This articleneeds additional citations forverification. Please helpimprove this article byadding citations to reliable sources. Unsourced material may be challenged and removed.
Find sources: "Dylan" programming language – news ·newspapers ·books ·scholar ·JSTOR
(June 2013) (Learn how and when to remove this message)
Dylan
Paradigmmulti-paradigm:functional,object-oriented
DeveloperOpen Source CommunityApple Computer,Harlequin,Carnegie Mellon University
First appeared1992; 34 years ago (1992)
Stable release
2025.1 / June 21, 2025; 7 months ago (2025-06-21)
Typing disciplineStrong,gradual
PlatformIA-32,x86-64
OSCross-platform
Filename extensionsdylan, lid
Websiteopendylan.org
Majorimplementations
Open Dylan, Gwydion Dylan
Dialects
infix-dylan (AKA Dylan), prefix-dylan (historical only)
Influenced by
Common Lisp,ALGOL,Scheme,EuLisp
Influenced
Lasso,Python,Ruby,Julia[1]

Dylan is a multi-paradigmprogramming language that includes support forfunctional andobject-oriented programming (OOP), and isdynamic andreflective while providing aprogramming model designed to support generating efficientmachine code, including fine-grained control over dynamic and static behaviors. It was created in the early 1990s by a group led byApple Computer.

Dylan derives fromScheme andCommon Lisp and adds an integrated object system derived from theCommon Lisp Object System (CLOS). In Dylan, all values (including numbers, characters, functions, andclasses) arefirst-class objects. Dylan supportsmultiple inheritance,polymorphism,multiple dispatch,keyword arguments, object introspection,pattern-basedsyntax extension macros, and many other advanced features. Programs can express fine-grained control over dynamism, admitting programs that occupy a continuum between dynamic and static programming and supporting evolutionary development (allowing for rapid prototyping followed by incremental refinement and optimization).

Dylan's main design goal is to be a dynamic language well-suited for developingcommercial software. Dylan attempts to address potential performance issues by introducing "natural" limits to the full flexibility ofLisp systems, allowing thecompiler to clearly understand compilable units, such aslibraries.

Dylan derives much of its semantics from Scheme and other Lisps; some Dylan implementations were initially built within extant Lisp systems. However, Dylan has anALGOL-like syntax instead of a Lisp-like prefix syntax.

History

[edit]
Further information:History of the Dylan programming language

Dylan was created in the early 1990s by a group led byApple Computer. At one time in its development, it was intended for use with theApple Newton computer, but the Dylan implementation did not reach sufficient maturity in time, and Newton instead used a mix of C and theNewtonScript developed by Walter Smith. Apple ended their Dylan development effort in 1995, though they made a "technology release" version available (Apple Dylan TR1) that included an advancedintegrated development environment (IDE).

Two other groups contributed to the design of the language and developed implementations:Harlequin released a commercial IDE forMicrosoft Windows andCarnegie Mellon University released anopen source compiler forUnix systems called Gwydion Dylan. Both of these implementations are now open source. The Harlequin implementation is now named Open Dylan and is maintained by a group of volunteers, the Dylan Hackers.

The Dylan language was code-named Ralph. James Joaquin chose the name Dylan for "DYnamic LANguage."

Syntax

[edit]

Many of Dylan's syntax features come from its Lisp heritage. Originally, Dylan used a Lisp-like prefix syntax, which was based ons-expressions. By the time the language design was completed, the syntax was changed to an ALGOL-like syntax, with the expectation that it would be more familiar to a wider audience of programmers. The syntax was designed by Michael Kahl. It is described in great detail in the Dylan Reference Manual.[2]

Lexical syntax

[edit]

Dylan is notcase sensitive. Dylan'slexical syntax allows the use of a naming convention wherehyphen (minus) signs are used to connect the parts of multiple-word identifiers (sometimes called "lisp-case" or "kebab case"). This convention is common in Lisp languages.

Besidesalphanumeric characters and hyphen-minus signs, Dylan allows a variety of non-alphanumeric characters as part of identifiers. Identifiers may not consist of these non-alphanumeric characters alone.[2] If there is any ambiguity, whitespace is used.

Example code

[edit]

A simple class with several slots:

defineclass<point>(<object>)slotpoint-x::<integer>,required-init-keyword:x:;slotpoint-y::<integer>,required-init-keyword:y:;endclass<point>;

By convention, classes are named with less-than and greater-than signs used asangle brackets, e.g. the class named<point> in the code example.

Inend class <point> bothclass and<point> are optional. This is true for allend clauses. For example, one may writeend if or justend to terminate anif statement.

To make an instance of<point>:

make(<point>,x:100,y:200)


The same class, rewritten in the most minimal way possible:

defineclass<point>(<object>)slotpoint-x;slotpoint-y;end;

The slots are now both typed as<object>. The slots must be initialized manually:

letp=make(<point>);point-x(p):=100;// or p.point-x := 100;point-y(p):=200;// or p.point-y := 200;

By convention, constant names begin with "$":

defineconstant$pi::<double-float>=3.1415927d0;

A factorial function:

definefunctionfactorial(n::<integer>)=>(n!::<integer>)casen<0=>error("Can't take factorial of negative integer: %d\n",n);n=0=>1;otherwise=>n*factorial(n-1);endend;

Here,n! and<integer> are just normal identifiers.

There is no explicitreturn statement. The result of a method or function is the last expression evaluated. It is a common style to leave off the semicolon after an expression in return position.

Modules vs. namespace

[edit]

In many object-oriented languages, classes are the main means of encapsulation and modularity; each class defines a namespace and controls which definitions are externally visible. Further, classes in many languages define an indivisible unit that must be used as a whole. For example, using aString concatenation function requires importing and compiling against all ofString.

Some languages, including Dylan, also include a separate, explicit namespace or module system that performs encapsulation in a more general way.

In Dylan, the concepts of compile-unit and import-unit are separated, and classes have nothing specifically to do with either. Alibrary defines items that should be compiled and handled together, while amodule defines a namespace. Classes can be placed together in modules, or cut across them, as the programmer wishes. Often the complete definition for a class does not exist in a single module, but is spread across several that are optionally collected together. Different programs can have different definitions of the same class, including only what they need.

For example, consider an add-on library forregex support onString. In some languages, for the functionality to be included in strings, the functionality must be added to theString namespace. As soon as this occurs, theString class becomes larger, and functions that don't need to use regex still must "pay" for it in increased library size. For this reason, these sorts of add-ons are typically placed in their own namespaces and objects. The downside to this approach is that the new functions are no longer apart ofString; instead, it is isolated in its own set of functions that must be called separately. Instead ofmyString.parseWith(myPattern), which would be the natural organization from an OO viewpoint, something likemyPattern.parseString(myString) is used, which effectively reverses the ordering.

Under Dylan, many interfaces can be defined for the same code, for instance the String concatenation method could be placed in both the String interface, and the "concat" interface which collects together all of the different concatenation functions from various classes. This is more commonly used in math libraries, where functions tend to be applicable to widely differing object types.

A more practical use of the interface construct is to build public and private versions of a module, something that other languages include as abolt on feature that invariably causes problems and adds syntax. Under Dylan, every function call can be simply placed in the "Private" or "Development" interface, and collect up publicly accessible functions inPublic. UnderJava orC++ the visibility of an object is defined in the code, meaning that to support a similar change, a programmer would be forced to rewrite the definitions fully, and could not have two versions at the same time.

Classes

[edit]

Classes in Dylan describeslots (data members, fields, ivars, etc.) of objects in a fashion similar to most OO languages. All access to slots is via methods, as inSmalltalk. Default getter and setter methods are automatically generated based on the slot names. In contrast with most other OO languages, other methods applicable to the class are often defined outside of the class, and thus class definitions in Dylan typically include the definition of the storage only. For instance:

defineclass<window>(<view>)slottitle::<string>="untitled",init-keyword:title:;slotposition::<point>,required-init-keyword:position:;endclass;

In this example, the class "<window>" is defined. The <class name> syntax is convention only, to make the class names stand out—the angle brackets are merely part of the class name. In contrast, in some languages the convention is to capitalize the first letter of the class name or to prefix the name with aC orT (for example).<window> inherits from a single class,<view>, and contains two slots,title holding a string for the window title, andposition holding an X-Y point for a corner of the window. In this example, the title has been given a default value, while the position has not. The optionalinit-keyword syntax allows the programmer to specify the initial value of the slot when instantiating an object of the class.

In languages such as C++ or Java, the class would also define its interface. In this case the definition above has no explicit instructions, so in both languages access to the slots and methods is consideredprotected, meaning they can be used only by subclasses. To allow unrelated code to use the window instances, they must be declaredpublic.

In Dylan, these sorts of visibility rules are not considered part of the code, but of the module/interface system. This adds considerable flexibility. For instance, one interface used during early development could declare everything public, whereas one used in testing and deployment could limit this. With C++ or Java these changes would require changes to the source code, so people won't do it, whereas in Dylan this is a fully unrelated concept.

Although this example does not use it, Dylan also supportsmultiple inheritance.

Methods and generic functions

[edit]

In Dylan, methods are not intrinsically associated with any specific class; methods can be thought of as existing outside of classes. Like CLOS, Dylan is based onmultiple dispatch (multimethods), where the specific method to be called is chosen based on the types of all its arguments. The method need not be known at compile time, the understanding being that the required function may be available, or not, based on a user's preferences.

Under Java the same methods would be isolated in a specific class. To use that functionality the programmer is forced toimport that class and refer to it explicitly to call the method. If that class is unavailable, or unknown at compile time, the application simply won't compile.

In Dylan, code is isolated from storage infunctions. Many classes have methods that call their own functions, thereby looking and feeling like most other OO languages. However code may also be located ingeneric functions, meaning they are not attached to a specific class, and can be called natively by anyone. Linking a specific generic function to a method in a class is accomplished thusly:

definemethodturn-blue(w::<window>)w.color:=$blue;endmethod;

This definition is similar to those in other languages, and would likely be encapsulated within the<window> class. Note the := setter call, which issyntactic sugar forcolor-setter($blue, w).

The utility of generic methods comes into its own when one considers more "generic" examples. For instance, one common function in most languages is theto-string, which returns somehuman-readable form for the object. For instance, a window might return its title and its position in parens, while a string would return itself. In Dylan these methods could all be collected into a single module called "to-string", thereby removing this code from the definition of the class itself. If a specific object did not support ato-string, it could be easily added in theto-string module.

Extensibility

[edit]

This whole concept might strike some readers as very odd. The code to handleto-string for a window isn't defined in<window>? This might not make any sense until one considers how Dylan handles the call of theto-string. In most languages[which?] when the program is compiled theto-string for<window> is looked up and replaced with a pointer (more or less) to the method. In Dylan this occurs when the program is first run; theruntime builds a table of method-name/parameters details and looks up methods dynamically via this table. That means that a function for a specific method can be located anywhere, not just in the compile-time unit. In the end the programmer is given considerable flexibility in terms of where to place their code, collecting it along class lines where appropriate, and functional lines where it's not.

The implication here is that a programmer can add functionality to existing classes by defining functions in a separate file. For instance, one might wish to add spell checking to all<string>s, which in C++ or Java would require access to the source code of the string class—and such basic classes are rarely given out in source form. In Dylan (and other "extensible languages") the spell checking method could be added in thespell-check module, defining all of the classes on which it can be applied via thedefine method construct. In this case the actual functionality might be defined in a single generic function, which takes a string and returns the errors. When thespell-check module is compiled into a program, all strings (and other objects) will get the added functionality.

Apple Dylan

[edit]
Main article:Apple Dylan

Apple Dylan is the implementation of Dylan produced byApple Computer. It was originally developed for theApple Newton product.

References

[edit]
  1. ^Stokel-Walker, Chris."Julia: The Goldilocks language".Increment. Stripe. Retrieved23 August 2020.
  2. ^abAndrew Shalit; David Moon; Orca Starbuck (11 September 1996).The Dylan Reference Manual. Apple Press.Addison-Wesley.ISBN 9780201442113.

External links

[edit]
Features
Object systems
Implementations
Standardized
Common
Lisp
Scheme
ISLISP
Unstandardized
Logo
POP
Operating system
Hardware
Community
of practice
Technical standards
Education
Books
Curriculum
Organizations
Business
Education
People
Common
Lisp
Scheme
Logo
POP
Authority control databases: NationalEdit this at Wikidata
Retrieved from "https://en.wikipedia.org/w/index.php?title=Dylan_(programming_language)&oldid=1338385472"
Categories:
Hidden categories:

[8]ページ先頭

©2009-2026 Movatter.jp