+++ /dev/null
-This is Info file ../../info/internals.info, produced by Makeinfo
-version 1.68 from the input file internals.texi.
-
-INFO-DIR-SECTION XEmacs Editor
-START-INFO-DIR-ENTRY
-* Internals: (internals). XEmacs Internals Manual.
-END-INFO-DIR-ENTRY
-
- Copyright (C) 1992 - 1996 Ben Wing. Copyright (C) 1996, 1997 Sun
-Microsystems. Copyright (C) 1994 - 1998 Free Software Foundation.
-Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
-
- Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
- Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided that the
-entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
- Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be stated in a
-translation approved by the Foundation.
-
- Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the section entitled "GNU General Public License" is included
-exactly as in the original, and provided that the entire resulting
-derived work is distributed under the terms of a permission notice
-identical to this one.
-
- Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the section entitled "GNU General Public License"
-may be included in a translation approved by the Free Software
-Foundation instead of in the original English.
-
-\1f
-File: internals.info, Node: Top, Next: A History of Emacs, Prev: (dir), Up: (dir)
-
- This Info file contains v1.0 of the XEmacs Internals Manual.
-
-* Menu:
-
-* A History of Emacs:: Times, dates, important events.
-* XEmacs From the Outside:: A broad conceptual overview.
-* The Lisp Language:: An overview.
-* XEmacs From the Perspective of Building::
-* XEmacs From the Inside::
-* The XEmacs Object System (Abstractly Speaking)::
-* How Lisp Objects Are Represented in C::
-* Rules When Writing New C Code::
-* A Summary of the Various XEmacs Modules::
-* Allocation of Objects in XEmacs Lisp::
-* Events and the Event Loop::
-* Evaluation; Stack Frames; Bindings::
-* Symbols and Variables::
-* Buffers and Textual Representation::
-* MULE Character Sets and Encodings::
-* The Lisp Reader and Compiler::
-* Lstreams::
-* Consoles; Devices; Frames; Windows::
-* The Redisplay Mechanism::
-* Extents::
-* Faces::
-* Glyphs::
-* Specifiers::
-* Menus::
-* Subprocesses::
-* Interface to X Windows::
-* Index:: Index including concepts, functions, variables,
- and other terms.
-
- -- The Detailed Node Listing --
-
-Here are other nodes that are inferiors of those already listed,
-mentioned here so you can get to them in one step:
-
-A History of Emacs
-
-* Through Version 18:: Unification prevails.
-* Lucid Emacs:: One version 19 Emacs.
-* GNU Emacs 19:: The other version 19 Emacs.
-* XEmacs:: The continuation of Lucid Emacs.
-
-Rules When Writing New C Code
-
-* General Coding Rules::
-* Writing Lisp Primitives::
-* Adding Global Lisp Variables::
-* Techniques for XEmacs Developers::
-
-A Summary of the Various XEmacs Modules
-
-* Low-Level Modules::
-* Basic Lisp Modules::
-* Modules for Standard Editing Operations::
-* Editor-Level Control Flow Modules::
-* Modules for the Basic Displayable Lisp Objects::
-* Modules for other Display-Related Lisp Objects::
-* Modules for the Redisplay Mechanism::
-* Modules for Interfacing with the File System::
-* Modules for Other Aspects of the Lisp Interpreter and Object System::
-* Modules for Interfacing with the Operating System::
-* Modules for Interfacing with X Windows::
-* Modules for Internationalization::
-
-Allocation of Objects in XEmacs Lisp
-
-* Introduction to Allocation::
-* Garbage Collection::
-* GCPROing::
-* Garbage Collection - Step by Step::
-* Integers and Characters::
-* Allocation from Frob Blocks::
-* lrecords::
-* Low-level allocation::
-* Pure Space::
-* Cons::
-* Vector::
-* Bit Vector::
-* Symbol::
-* Marker::
-* String::
-* Compiled Function::
-
-Events and the Event Loop
-
-* Introduction to Events::
-* Main Loop::
-* Specifics of the Event Gathering Mechanism::
-* Specifics About the Emacs Event::
-* The Event Stream Callback Routines::
-* Other Event Loop Functions::
-* Converting Events::
-* Dispatching Events; The Command Builder::
-
-Evaluation; Stack Frames; Bindings
-
-* Evaluation::
-* Dynamic Binding; The specbinding Stack; Unwind-Protects::
-* Simple Special Forms::
-* Catch and Throw::
-
-Symbols and Variables
-
-* Introduction to Symbols::
-* Obarrays::
-* Symbol Values::
-
-Buffers and Textual Representation
-
-* Introduction to Buffers:: A buffer holds a block of text such as a file.
-* The Text in a Buffer:: Representation of the text in a buffer.
-* Buffer Lists:: Keeping track of all buffers.
-* Markers and Extents:: Tagging locations within a buffer.
-* Bufbytes and Emchars:: Representation of individual characters.
-* The Buffer Object:: The Lisp object corresponding to a buffer.
-
-MULE Character Sets and Encodings
-
-* Character Sets::
-* Encodings::
-* Internal Mule Encodings::
-
-Encodings
-
-* Japanese EUC (Extended Unix Code)::
-* JIS7::
-
-Internal Mule Encodings
-
-* Internal String Encoding::
-* Internal Character Encoding::
-
-The Lisp Reader and Compiler
-
-Lstreams
-
-Consoles; Devices; Frames; Windows
-
-* Introduction to Consoles; Devices; Frames; Windows::
-* Point::
-* Window Hierarchy::
-
-The Redisplay Mechanism
-
-* Critical Redisplay Sections::
-* Line Start Cache::
-
-Extents
-
-* Introduction to Extents:: Extents are ranges over text, with properties.
-* Extent Ordering:: How extents are ordered internally.
-* Format of the Extent Info:: The extent information in a buffer or string.
-* Zero-Length Extents:: A weird special case.
-* Mathematics of Extent Ordering:: A rigorous foundation.
-* Extent Fragments:: Cached information useful for redisplay.
-
-Faces
-
-Glyphs
-
-Specifiers
-
-Menus
-
-Subprocesses
-
-Interface to X Windows
-
-\1f
-File: internals.info, Node: A History of Emacs, Next: XEmacs From the Outside, Prev: Top, Up: Top
-
-A History of Emacs
-******************
-
- XEmacs is a powerful, customizable text editor and development
-environment. It began as Lucid Emacs, which was in turn derived from
-GNU Emacs, a program written by Richard Stallman of the Free Software
-Foundation. GNU Emacs dates back to the 1970's, and was modelled after
-a package called "Emacs", written in 1976, that was a set of macros on
-top of TECO, an old, old text editor written at MIT on the DEC PDP 10
-under one of the earliest time-sharing operating systems, ITS
-(Incompatible Timesharing System). (ITS dates back well before Unix.)
-ITS, TECO, and Emacs were products of a group of people at MIT who
-called themselves "hackers", who shared an idealistic belief system
-about the free exchange of information and were fanatical in their
-devotion to and time spent with computers. (The hacker subculture dates
-back to the late 1950's at MIT and is described in detail in Steven
-Levy's book `Hackers'. This book also includes a lot of information
-about Stallman himself and the development of Lisp, a programming
-language developed at MIT that underlies Emacs.)
-
-* Menu:
-
-* Through Version 18:: Unification prevails.
-* Lucid Emacs:: One version 19 Emacs.
-* GNU Emacs 19:: The other version 19 Emacs.
-* GNU Emacs 20:: The other version 20 Emacs.
-* XEmacs:: The continuation of Lucid Emacs.
-
-\1f
-File: internals.info, Node: Through Version 18, Next: Lucid Emacs, Up: A History of Emacs
-
-Through Version 18
-==================
-
- Although the history of the early versions of GNU Emacs is unclear,
-the history is well-known from the middle of 1985. A time line is:
-
- * GNU Emacs version 15 (15.34) was released sometime in 1984 or 1985
- and shared some code with a version of Emacs written by James
- Gosling (the same James Gosling who later created the Java
- language).
-
- * GNU Emacs version 16 (first released version was 16.56) was
- released on July 15, 1985. All Gosling code was removed due to
- potential copyright problems with the code.
-
- * version 16.57: released on September 16, 1985.
-
- * versions 16.58, 16.59: released on September 17, 1985.
-
- * version 16.60: released on September 19, 1985. These later
- version 16's incorporated patches from the net, esp. for getting
- Emacs to work under System V.
-
- * version 17.36 (first official v17 release) released on December 20,
- 1985. Included a TeX-able user manual. First official unpatched
- version that worked on vanilla System V machines.
-
- * version 17.43 (second official v17 release) released on January 25,
- 1986.
-
- * version 17.45 released on January 30, 1986.
-
- * version 17.46 released on February 4, 1986.
-
- * version 17.48 released on February 10, 1986.
-
- * version 17.49 released on February 12, 1986.
-
- * version 17.55 released on March 18, 1986.
-
- * version 17.57 released on March 27, 1986.
-
- * version 17.58 released on April 4, 1986.
-
- * version 17.61 released on April 12, 1986.
-
- * version 17.63 released on May 7, 1986.
-
- * version 17.64 released on May 12, 1986.
-
- * version 18.24 (a beta version) released on October 2, 1986.
-
- * version 18.30 (a beta version) released on November 15, 1986.
-
- * version 18.31 (a beta version) released on November 23, 1986.
-
- * version 18.32 (a beta version) released on December 7, 1986.
-
- * version 18.33 (a beta version) released on December 12, 1986.
-
- * version 18.35 (a beta version) released on January 5, 1987.
-
- * version 18.36 (a beta version) released on January 21, 1987.
-
- * January 27, 1987: The Great Usenet Renaming. net.emacs is now
- comp.emacs.
-
- * version 18.37 (a beta version) released on February 12, 1987.
-
- * version 18.38 (a beta version) released on March 3, 1987.
-
- * version 18.39 (a beta version) released on March 14, 1987.
-
- * version 18.40 (a beta version) released on March 18, 1987.
-
- * version 18.41 (the first "official" release) released on March 22,
- 1987.
-
- * version 18.45 released on June 2, 1987.
-
- * version 18.46 released on June 9, 1987.
-
- * version 18.47 released on June 18, 1987.
-
- * version 18.48 released on September 3, 1987.
-
- * version 18.49 released on September 18, 1987.
-
- * version 18.50 released on February 13, 1988.
-
- * version 18.51 released on May 7, 1988.
-
- * version 18.52 released on September 1, 1988.
-
- * version 18.53 released on February 24, 1989.
-
- * version 18.54 released on April 26, 1989.
-
- * version 18.55 released on August 23, 1989. This is the earliest
- version that is still available by FTP.
-
- * version 18.56 released on January 17, 1991.
-
- * version 18.57 released late January, 1991.
-
- * version 18.58 released ?????.
-
- * version 18.59 released October 31, 1992.
-
-\1f
-File: internals.info, Node: Lucid Emacs, Next: GNU Emacs 19, Prev: Through Version 18, Up: A History of Emacs
-
-Lucid Emacs
-===========
-
- Lucid Emacs was developed by the (now-defunct) Lucid Inc., a maker of
-C++ and Lisp development environments. It began when Lucid decided they
-wanted to use Emacs as the editor and cornerstone of their C++
-development environment (called "Energize"). They needed many features
-that were not available in the existing version of GNU Emacs (version
-18.5something), in particular good and integrated support for GUI
-elements such as mouse support, multiple fonts, multiple window-system
-windows, etc. A branch of GNU Emacs called Epoch, written at the
-University of Illinois, existed that supplied many of these features;
-however, Lucid needed more than what existed in Epoch. At the time, the
-Free Software Foundation was working on version 19 of Emacs (this was
-sometime around 1991), which was planned to have similar features, and
-so Lucid decided to work with the Free Software Foundation. Their plan
-was to add features that they needed, and coordinate with the FSF so
-that the features would get included back into Emacs version 19.
-
- Delays in the release of version 19 occurred, however (resulting in
-it finally being released more than a year after what was initially
-planned), and Lucid encountered unexpected technical resistance in
-getting their changes merged back into version 19, so they decided to
-release their own version of Emacs, which became Lucid Emacs 19.0.
-
- The initial authors of Lucid Emacs were Matthieu Devin, Harlan
-Sexton, and Eric Benson, and the work was later taken over by Jamie
-Zawinski, who became "Mr. Lucid Emacs" for many releases.
-
- A time line for Lucid Emacs/XEmacs is
-
- * version 19.0 shipped with Energize 1.0, April 1992.
-
- * version 19.1 released June 4, 1992.
-
- * version 19.2 released June 19, 1992.
-
- * version 19.3 released September 9, 1992.
-
- * version 19.4 released January 21, 1993.
-
- * version 19.5 was a repackaging of 19.4 with a few bug fixes and
- shipped with Energize 2.0. Never released to the net.
-
- * version 19.6 released April 9, 1993.
-
- * version 19.7 was a repackaging of 19.6 with a few bug fixes and
- shipped with Energize 2.1. Never released to the net.
-
- * version 19.8 released September 6, 1993.
-
- * version 19.9 released January 12, 1994.
-
- * version 19.10 released May 27, 1994.
-
- * version 19.11 (first XEmacs) released September 13, 1994.
-
- * version 19.12 released June 23, 1995.
-
- * version 19.13 released September 1, 1995.
-
- * version 19.14 released June 23, 1996.
-
- * version 20.0 released February 9, 1997.
-
- * version 19.15 released March 28, 1997.
-
- * version 20.1 (not released to the net) April 15, 1997.
-
- * version 20.2 released May 16, 1997.
-
- * version 19.16 released October 31, 1997.
-
- * version 20.3 (the first stable version of XEmacs 20.x) released
- November 30, 1997. version 20.4 released February 28, 1998.
-
-\1f
-File: internals.info, Node: GNU Emacs 19, Next: GNU Emacs 20, Prev: Lucid Emacs, Up: A History of Emacs
-
-GNU Emacs 19
-============
-
- About a year after the initial release of Lucid Emacs, the FSF
-released a beta of their version of Emacs 19 (referred to here as "GNU
-Emacs"). By this time, the current version of Lucid Emacs was 19.6.
-(Strangely, the first released beta from the FSF was GNU Emacs 19.7.) A
-time line for GNU Emacs version 19 is
-
- * version 19.8 (beta) released May 27, 1993.
-
- * version 19.9 (beta) released May 27, 1993.
-
- * version 19.10 (beta) released May 30, 1993.
-
- * version 19.11 (beta) released June 1, 1993.
-
- * version 19.12 (beta) released June 2, 1993.
-
- * version 19.13 (beta) released June 8, 1993.
-
- * version 19.14 (beta) released June 17, 1993.
-
- * version 19.15 (beta) released June 19, 1993.
-
- * version 19.16 (beta) released July 6, 1993.
-
- * version 19.17 (beta) released late July, 1993.
-
- * version 19.18 (beta) released August 9, 1993.
-
- * version 19.19 (beta) released August 15, 1993.
-
- * version 19.20 (beta) released November 17, 1993.
-
- * version 19.21 (beta) released November 17, 1993.
-
- * version 19.22 (beta) released November 28, 1993.
-
- * version 19.23 (beta) released May 17, 1994.
-
- * version 19.24 (beta) released May 16, 1994.
-
- * version 19.25 (beta) released June 3, 1994.
-
- * version 19.26 (beta) released September 11, 1994.
-
- * version 19.27 (beta) released September 14, 1994.
-
- * version 19.28 (first "official" release) released November 1, 1994.
-
- * version 19.29 released June 21, 1995.
-
- * version 19.30 released November 24, 1995.
-
- * version 19.31 released May 25, 1996.
-
- * version 19.32 released July 31, 1996.
-
- * version 19.33 released August 11, 1996.
-
- * version 19.34 released August 21, 1996.
-
- * version 19.34b released September 6, 1996.
-
- In some ways, GNU Emacs 19 was better than Lucid Emacs; in some ways,
-worse. Lucid soon began incorporating features from GNU Emacs 19 into
-Lucid Emacs; the work was mostly done by Richard Mlynarik, who had been
-working on and using GNU Emacs for a long time (back as far as version
-16 or 17).
-
-\1f
-File: internals.info, Node: GNU Emacs 20, Next: XEmacs, Prev: GNU Emacs 19, Up: A History of Emacs
-
-GNU Emacs 20
-============
-
- On February 2, 1997 work began on GNU Emacs to integrate Mule. The
-first release was made in September of that year.
-
- A timeline for Emacs 20 is
-
- * version 20.1 released September 17, 1997.
-
- * version 20.2 released September 20, 1997.
-
- * version 20.3 released August 19, 1998.
-
-\1f
-File: internals.info, Node: XEmacs, Prev: GNU Emacs 20, Up: A History of Emacs
-
-XEmacs
-======
-
- Around the time that Lucid was developing Energize, Sun Microsystems
-was developing their own development environment (called "SPARCWorks")
-and also decided to use Emacs. They joined forces with the Epoch team
-at the University of Illinois and later with Lucid. The maintainer of
-the last-released version of Epoch was Marc Andreessen, but he dropped
-out and the Epoch project, headed by Simon Kaplan, lured Chuck Thompson
-away from a system administration job to become the primary Lucid Emacs
-author for Epoch and Sun. Chuck's area of specialty became the
-redisplay engine (he replaced the old Lucid Emacs redisplay engine with
-a ported version from Epoch and then later rewrote it from scratch).
-Sun also hired Ben Wing (the author of Win-Emacs, a port of Lucid Emacs
-to Microsoft Windows 3.1) in 1993, for what was initially a one-month
-contract to fix some event problems but later became a many-year
-involvement, punctuated by a six-month contract with Amdahl Corporation.
-
- In 1994, Sun and Lucid agreed to rename Lucid Emacs to XEmacs (a name
-not favorable to either company); the first release called XEmacs was
-version 19.11. In June 1994, Lucid folded and Jamie quit to work for
-the newly formed Mosaic Communications Corp., later Netscape
-Communications Corp. (co-founded by the same Marc Andreessen, who had
-quit his Epoch job to work on a graphical browser for the World Wide
-Web). Chuck then become the primary maintainer of XEmacs, and put out
-versions 19.11 through 19.14 in conjunction with Ben. For 19.12 and
-19.13, Chuck added the new redisplay and many other display improvements
-and Ben added MULE support (support for Asian and other languages) and
-redesigned most of the internal Lisp subsystems to better support the
-MULE work and the various other features being added to XEmacs. After
-19.14 Chuck retired as primary maintainer and Steve Baur stepped in.
-
- Soon after 19.13 was released, work began in earnest on the MULE
-internationalization code and the source tree was divided into two
-development paths. The MULE version was initially called 19.20, but was
-soon renamed to 20.0. In 1996 Martin Buchholz of Sun Microsystems took
-over the care and feeding of it and worked on it in parallel with the
-19.14 development that was occurring at the same time. After much work
-by Martin, it was decided to release 20.0 ahead of 19.15 in February
-1997. The source tree remained divided until 20.2 when the version 19
-source was finally retired at version 19.16.
-
- In 1997, Sun finally dropped all pretense of support for XEmacs and
-Martin Buchholz left the company in November. Since then, and mostly
-for the previous year, because Steve Baur was never paid to work on
-XEmacs, XEmacs has existed solely on the contributions of volunteers
-from the Free Software Community. Starting from 1997, Hrvoje Niksic and
-Kyle Jones have figured prominently in XEmacs development.
-
- Many attempts have been made to merge XEmacs and GNU Emacs, but they
-have consistently failed.
-
- A more detailed history is contained in the XEmacs About page.
-
-\1f
-File: internals.info, Node: XEmacs From the Outside, Next: The Lisp Language, Prev: A History of Emacs, Up: Top
-
-XEmacs From the Outside
-***********************
-
- XEmacs appears to the outside world as an editor, but it is really a
-Lisp environment. At its heart is a Lisp interpreter; it also
-"happens" to contain many specialized object types (e.g. buffers,
-windows, frames, events) that are useful for implementing an editor.
-Some of these objects (in particular windows and frames) have
-displayable representations, and XEmacs provides a function
-`redisplay()' that ensures that the display of all such objects matches
-their internal state. Most of the time, a standard Lisp environment is
-in a "read-eval-print" loop - i.e. "read some Lisp code, execute it,
-and print the results". XEmacs has a similar loop:
-
- * read an event
-
- * dispatch the event (i.e. "do it")
-
- * redisplay
-
- Reading an event is done using the Lisp function `next-event', which
-waits for something to happen (typically, the user presses a key or
-moves the mouse) and returns an event object describing this.
-Dispatching an event is done using the Lisp function `dispatch-event',
-which looks up the event in a keymap object (a particular kind of
-object that associates an event with a Lisp function) and calls that
-function. The function "does" what the user has requested by changing
-the state of particular frame objects, buffer objects, etc. Finally,
-`redisplay()' is called, which updates the display to reflect those
-changes just made. Thus is an "editor" born.
-
- Note that you do not have to use XEmacs as an editor; you could just
-as well make it do your taxes, compute pi, play bridge, etc. You'd just
-have to write functions to do those operations in Lisp.
-
-\1f
-File: internals.info, Node: The Lisp Language, Next: XEmacs From the Perspective of Building, Prev: XEmacs From the Outside, Up: Top
-
-The Lisp Language
-*****************
-
- Lisp is a general-purpose language that is higher-level than C and in
-many ways more powerful than C. Powerful dialects of Lisp such as
-Common Lisp are probably much better languages for writing very large
-applications than is C. (Unfortunately, for many non-technical reasons
-C and its successor C++ have become the dominant languages for
-application development. These languages are both inadequate for
-extremely large applications, which is evidenced by the fact that newer,
-larger programs are becoming ever harder to write and are requiring ever
-more programmers despite great increases in C development environments;
-and by the fact that, although hardware speeds and reliability have been
-growing at an exponential rate, most software is still generally
-considered to be slow and buggy.)
-
- The new Java language holds promise as a better general-purpose
-development language than C. Java has many features in common with
-Lisp that are not shared by C (this is not a coincidence, since Java
-was designed by James Gosling, a former Lisp hacker). This will be
-discussed more later.
-
- For those used to C, here is a summary of the basic differences
-between C and Lisp:
-
- 1. Lisp has an extremely regular syntax. Every function, expression,
- and control statement is written in the form
-
- (FUNC ARG1 ARG2 ...)
-
- This is as opposed to C, which writes functions as
-
- func(ARG1, ARG2, ...)
-
- but writes expressions involving operators as (e.g.)
-
- ARG1 + ARG2
-
- and writes control statements as (e.g.)
-
- while (EXPR) { STATEMENT1; STATEMENT2; ... }
-
- Lisp equivalents of the latter two would be
-
- (+ ARG1 ARG2 ...)
-
- and
-
- (while EXPR STATEMENT1 STATEMENT2 ...)
-
- 2. Lisp is a safe language. Assuming there are no bugs in the Lisp
- interpreter/compiler, it is impossible to write a program that
- "core dumps" or otherwise causes the machine to execute an illegal
- instruction. This is very different from C, where perhaps the most
- common outcome of a bug is exactly such a crash. A corollary of
- this is that the C operation of casting a pointer is impossible
- (and unnecessary) in Lisp, and that it is impossible to access
- memory outside the bounds of an array.
-
- 3. Programs and data are written in the same form. The
- parenthesis-enclosing form described above for statements is the
- same form used for the most common data type in Lisp, the list.
- Thus, it is possible to represent any Lisp program using Lisp data
- types, and for one program to construct Lisp statements and then
- dynamically "evaluate" them, or cause them to execute.
-
- 4. All objects are "dynamically typed". This means that part of every
- object is an indication of what type it is. A Lisp program can
- manipulate an object without knowing what type it is, and can
- query an object to determine its type. This means that,
- correspondingly, variables and function parameters can hold
- objects of any type and are not normally declared as being of any
- particular type. This is opposed to the "static typing" of C,
- where variables can hold exactly one type of object and must be
- declared as such, and objects do not contain an indication of
- their type because it's implicit in the variables they are stored
- in. It is possible in C to have a variable hold different types
- of objects (e.g. through the use of `void *' pointers or
- variable-argument functions), but the type information must then be
- passed explicitly in some other fashion, leading to additional
- program complexity.
-
- 5. Allocated memory is automatically reclaimed when it is no longer
- in use. This operation is called "garbage collection" and
- involves looking through all variables to see what memory is being
- pointed to, and reclaiming any memory that is not pointed to and
- is thus "inaccessible" and out of use. This is as opposed to C,
- in which allocated memory must be explicitly reclaimed using
- `free()'. If you simply drop all pointers to memory without
- freeing it, it becomes "leaked" memory that still takes up space.
- Over a long period of time, this can cause your program to grow
- and grow until it runs out of memory.
-
- 6. Lisp has built-in facilities for handling errors and exceptions.
- In C, when an error occurs, usually either the program exits
- entirely or the routine in which the error occurs returns a value
- indicating this. If an error occurs in a deeply-nested routine,
- then every routine currently called must unwind itself normally
- and return an error value back up to the next routine. This means
- that every routine must explicitly check for an error in all the
- routines it calls; if it does not do so, unexpected and often
- random behavior results. This is an extremely common source of
- bugs in C programs. An alternative would be to do a non-local
- exit using `longjmp()', but that is often very dangerous because
- the routines that were exited past had no opportunity to clean up
- after themselves and may leave things in an inconsistent state,
- causing a crash shortly afterwards.
-
- Lisp provides mechanisms to make such non-local exits safe. When
- an error occurs, a routine simply signals that an error of a
- particular class has occurred, and a non-local exit takes place.
- Any routine can trap errors occurring in routines it calls by
- registering an error handler for some or all classes of errors.
- (If no handler is registered, a default handler, generally
- installed by the top-level event loop, is executed; this prints
- out the error and continues.) Routines can also specify cleanup
- code (called an "unwind-protect") that will be called when control
- exits from a block of code, no matter how that exit occurs - i.e.
- even if a function deeply nested below it causes a non-local exit
- back to the top level.
-
- Note that this facility has appeared in some recent vintages of C,
- in particular Visual C++ and other PC compilers written for the
- Microsoft Win32 API.
-
- 7. In Emacs Lisp, local variables are "dynamically scoped". This
- means that if you declare a local variable in a particular
- function, and then call another function, that subfunction can
- "see" the local variable you declared. This is actually
- considered a bug in Emacs Lisp and in all other early dialects of
- Lisp, and was corrected in Common Lisp. (In Common Lisp, you can
- still declare dynamically scoped variables if you want to - they
- are sometimes useful - but variables by default are "lexically
- scoped" as in C.)
-
- For those familiar with Lisp, Emacs Lisp is modelled after MacLisp,
-an early dialect of Lisp developed at MIT (no relation to the Macintosh
-computer). There is a Common Lisp compatibility package available for
-Emacs that provides many of the features of Common Lisp.
-
- The Java language is derived in many ways from C, and shares a
-similar syntax, but has the following features in common with Lisp (and
-different from C):
-
- 1. Java is a safe language, like Lisp.
-
- 2. Java provides garbage collection, like Lisp.
-
- 3. Java has built-in facilities for handling errors and exceptions,
- like Lisp.
-
- 4. Java has a type system that combines the best advantages of both
- static and dynamic typing. Objects (except very simple types) are
- explicitly marked with their type, as in dynamic typing; but there
- is a hierarchy of types and functions are declared to accept only
- certain types, thus providing the increased compile-time
- error-checking of static typing.
-
- The Java language also has some negative attributes:
-
- 1. Java uses the edit/compile/run model of software development. This
- makes it hard to use interactively. For example, to use Java like
- `bc' it is necessary to write a special purpose, albeit tiny,
- application. In Emacs Lisp, a calculator comes built-in without
- any effort - one can always just type an expression in the
- `*scratch*' buffer.
-
- 2. Java tries too hard to enforce, not merely enable, portability,
- making ordinary access to standard OS facilities painful. Java
- has an "agenda". I think this is why `chdir' is not part of
- standard Java, which is inexcusable.
-
- Unfortunately, there is no perfect language. Static typing allows a
-compiler to catch programmer errors and produce more efficient code, but
-makes programming more tedious and less fun. For the forseeable future,
-an Ideal Editing and Programming Environment (and that is what XEmacs
-aspires to) will be programmable in multiple languages: high level ones
-like Lisp for user customization and prototyping, and lower level ones
-for infrastructure and industrial strength applications. If I had my
-way, XEmacs would be friendly towards the Python, Scheme, C++, ML,
-etc... communities. But there are serious technical difficulties to
-achieving that goal.
-
- The word "application" in the previous paragraph was used
-intentionally. XEmacs implements an API for programs written in Lisp
-that makes it a full-fledged application platform, very much like an OS
-inside the real OS.
-
-\1f
-File: internals.info, Node: XEmacs From the Perspective of Building, Next: XEmacs From the Inside, Prev: The Lisp Language, Up: Top
-
-XEmacs From the Perspective of Building
-***************************************
-
- The heart of XEmacs is the Lisp environment, which is written in C.
-This is contained in the `src/' subdirectory. Underneath `src/' are
-two subdirectories of header files: `s/' (header files for particular
-operating systems) and `m/' (header files for particular machine
-types). In practice the distinction between the two types of header
-files is blurred. These header files define or undefine certain
-preprocessor constants and macros to indicate particular
-characteristics of the associated machine or operating system. As part
-of the configure process, one `s/' file and one `m/' file is identified
-for the particular environment in which XEmacs is being built.
-
- XEmacs also contains a great deal of Lisp code. This implements the
-operations that make XEmacs useful as an editor as well as just a Lisp
-environment, and also contains many add-on packages that allow XEmacs to
-browse directories, act as a mail and Usenet news reader, compile Lisp
-code, etc. There is actually more Lisp code than C code associated with
-XEmacs, but much of the Lisp code is peripheral to the actual operation
-of the editor. The Lisp code all lies in subdirectories underneath the
-`lisp/' directory.
-
- The `lwlib/' directory contains C code that implements a generalized
-interface onto different X widget toolkits and also implements some
-widgets of its own that behave like Motif widgets but are faster, free,
-and in some cases more powerful. The code in this directory compiles
-into a library and is mostly independent from XEmacs.
-
- The `etc/' directory contains various data files associated with
-XEmacs. Some of them are actually read by XEmacs at startup; others
-merely contain useful information of various sorts.
-
- The `lib-src/' directory contains C code for various auxiliary
-programs that are used in connection with XEmacs. Some of them are used
-during the build process; others are used to perform certain functions
-that cannot conveniently be placed in the XEmacs executable (e.g. the
-`movemail' program for fetching mail out of `/var/spool/mail', which
-must be setgid to `mail' on many systems; and the `gnuclient' program,
-which allows an external script to communicate with a running XEmacs
-process).
-
- The `man/' directory contains the sources for the XEmacs
-documentation. It is mostly in a form called Texinfo, which can be
-converted into either a printed document (by passing it through TeX) or
-into on-line documentation called "info files".
-
- The `info/' directory contains the results of formatting the XEmacs
-documentation as "info files", for on-line use. These files are used
-when you enter the Info system using `C-h i' or through the Help menu.
-
- The `dynodump/' directory contains auxiliary code used to build
-XEmacs on Solaris platforms.
-
- The other directories contain various miscellaneous code and
-information that is not normally used or needed.
-
- The first step of building involves running the `configure' program
-and passing it various parameters to specify any optional features you
-want and compiler arguments and such, as described in the `INSTALL'
-file. This determines what the build environment is, chooses the
-appropriate `s/' and `m/' file, and runs a series of tests to determine
-many details about your environment, such as which library functions
-are available and exactly how they work. The reason for running these
-tests is that it allows XEmacs to be compiled on a much wider variety
-of platforms than those that the XEmacs developers happen to be
-familiar with, including various sorts of hybrid platforms. This is
-especially important now that many operating systems give you a great
-deal of control over exactly what features you want installed, and allow
-for easy upgrading of parts of a system without upgrading the rest. It
-would be impossible to pre-determine and pre-specify the information for
-all possible configurations.
-
- In fact, the `s/' and `m/' files are basically *evil*, since they
-contain unmaintainable platform-specific hard-coded information.
-XEmacs has been moving in the direction of having all system-specific
-information be determined dynamically by `configure'. Perhaps someday
-we can `rm -rf src/s src/m'.
-
- When configure is done running, it generates `Makefile's and
-`GNUmakefile's and the file `src/config.h' (which describes the
-features of your system) from template files. You then run `make',
-which compiles the auxiliary code and programs in `lib-src/' and
-`lwlib/' and the main XEmacs executable in `src/'. The result of
-compiling and linking is an executable called `temacs', which is *not*
-the final XEmacs executable. `temacs' by itself is not intended to
-function as an editor or even display any windows on the screen, and if
-you simply run it, it will exit immediately. The `Makefile' runs
-`temacs' with certain options that cause it to initialize itself, read
-in a number of basic Lisp files, and then dump itself out into a new
-executable called `xemacs'. This new executable has been
-pre-initialized and contains pre-digested Lisp code that is necessary
-for the editor to function (this includes most basic editing functions,
-e.g. `kill-line', that can be defined in terms of other Lisp
-primitives; some initialization code that is called when certain
-objects, such as frames, are created; and all of the standard
-keybindings and code for the actions they result in). This executable,
-`xemacs', is the executable that you run to use the XEmacs editor.
-
- Although `temacs' is not intended to be run as an editor, it can, by
-using the incantation `temacs -batch -l loadup.el run-temacs'. This is
-useful when the dumping procedure described above is broken, or when
-using certain program debugging tools such as Purify. These tools get
-mighty confused by the tricks played by the XEmacs build process, such
-as allocation memory in one process, and freeing it in the next.
-
-\1f
-File: internals.info, Node: XEmacs From the Inside, Next: The XEmacs Object System (Abstractly Speaking), Prev: XEmacs From the Perspective of Building, Up: Top
-
-XEmacs From the Inside
-**********************
-
- Internally, XEmacs is quite complex, and can be very confusing. To
-simplify things, it can be useful to think of XEmacs as containing an
-event loop that "drives" everything, and a number of other subsystems,
-such as a Lisp engine and a redisplay mechanism. Each of these other
-subsystems exists simultaneously in XEmacs, and each has a certain
-state. The flow of control continually passes in and out of these
-different subsystems in the course of normal operation of the editor.
-
- It is important to keep in mind that, most of the time, the editor is
-"driven" by the event loop. Except during initialization and batch
-mode, all subsystems are entered directly or indirectly through the
-event loop, and ultimately, control exits out of all subsystems back up
-to the event loop. This cycle of entering a subsystem, exiting back out
-to the event loop, and starting another iteration of the event loop
-occurs once each keystroke, mouse motion, etc.
-
- If you're trying to understand a particular subsystem (other than the
-event loop), think of it as a "daemon" process or "servant" that is
-responsible for one particular aspect of a larger system, and
-periodically receives commands or environment changes that cause it to
-do something. Ultimately, these commands and environment changes are
-always triggered by the event loop. For example:
-
- * The window and frame mechanism is responsible for keeping track of
- what windows and frames exist, what buffers are in them, etc. It
- is periodically given commands (usually from the user) to make a
- change to the current window/frame state: i.e. create a new frame,
- delete a window, etc.
-
- * The buffer mechanism is responsible for keeping track of what
- buffers exist and what text is in them. It is periodically given
- commands (usually from the user) to insert or delete text, create
- a buffer, etc. When it receives a text-change command, it
- notifies the redisplay mechanism.
-
- * The redisplay mechanism is responsible for making sure that
- windows and frames are displayed correctly. It is periodically
- told (by the event loop) to actually "do its job", i.e. snoop
- around and see what the current state of the environment (mostly
- of the currently-existing windows, frames, and buffers) is, and
- make sure that that state matches what's actually displayed. It
- keeps lots and lots of information around (such as what is
- actually being displayed currently, and what the environment was
- last time it checked) so that it can minimize the work it has to
- do. It is also helped along in that whenever a relevant change to
- the environment occurs, the redisplay mechanism is told about
- this, so it has a pretty good idea of where it has to look to find
- possible changes and doesn't have to look everywhere.
-
- * The Lisp engine is responsible for executing the Lisp code in
- which most user commands are written. It is entered through a
- call to `eval' or `funcall', which occurs as a result of
- dispatching an event from the event loop. The functions it calls
- issue commands to the buffer mechanism, the window/frame
- subsystem, etc.
-
- * The Lisp allocation subsystem is responsible for keeping track of
- Lisp objects. It is given commands from the Lisp engine to
- allocate objects, garbage collect, etc.
-
- etc.
-
- The important idea here is that there are a number of independent
-subsystems each with its own responsibility and persistent state, just
-like different employees in a company, and each subsystem is
-periodically given commands from other subsystems. Commands can flow
-from any one subsystem to any other, but there is usually some sort of
-hierarchy, with all commands originating from the event subsystem.
-
- XEmacs is entered in `main()', which is in `emacs.c'. When this is
-called the first time (in a properly-invoked `temacs'), it does the
-following:
-
- 1. It does some very basic environment initializations, such as
- determining where it and its directories (e.g. `lisp/' and `etc/')
- reside and setting up signal handlers.
-
- 2. It initializes the entire Lisp interpreter.
-
- 3. It sets the initial values of many built-in variables (including
- many variables that are visible to Lisp programs), such as the
- global keymap object and the built-in faces (a face is an object
- that describes the display characteristics of text). This
- involves creating Lisp objects and thus is dependent on step (2).
-
- 4. It performs various other initializations that are relevant to the
- particular environment it is running in, such as retrieving
- environment variables, determining the current date and the user
- who is running the program, examining its standard input, creating
- any necessary file descriptors, etc.
-
- 5. At this point, the C initialization is complete. A Lisp program
- that was specified on the command line (usually `loadup.el') is
- called (temacs is normally invoked as `temacs -batch -l loadup.el
- dump'). `loadup.el' loads all of the other Lisp files that are
- needed for the operation of the editor, calls the `dump-emacs'
- function to write out `xemacs', and then kills the temacs process.
-
- When `xemacs' is then run, it only redoes steps (1) and (4) above;
-all variables already contain the values they were set to when the
-executable was dumped, and all memory that was allocated with
-`malloc()' is still around. (XEmacs knows whether it is being run as
-`xemacs' or `temacs' because it sets the global variable `initialized'
-to 1 after step (4) above.) At this point, `xemacs' calls a Lisp
-function to do any further initialization, which includes parsing the
-command-line (the C code can only do limited command-line parsing,
-which includes looking for the `-batch' and `-l' flags and a few other
-flags that it needs to know about before initialization is complete),
-creating the first frame (or "window" in standard window-system
-parlance), running the user's init file (usually the file `.emacs' in
-the user's home directory), etc. The function to do this is usually
-called `normal-top-level'; `loadup.el' tells the C code about this
-function by setting its name as the value of the Lisp variable
-`top-level'.
-
- When the Lisp initialization code is done, the C code enters the
-event loop, and stays there for the duration of the XEmacs process.
-The code for the event loop is contained in `keyboard.c', and is called
-`Fcommand_loop_1()'. Note that this event loop could very well be
-written in Lisp, and in fact a Lisp version exists; but apparently,
-doing this makes XEmacs run noticeably slower.
-
- Notice how much of the initialization is done in Lisp, not in C. In
-general, XEmacs tries to move as much code as is possible into Lisp.
-Code that remains in C is code that implements the Lisp interpreter
-itself, or code that needs to be very fast, or code that needs to do
-system calls or other such stuff that needs to be done in C, or code
-that needs to have access to "forbidden" structures. (One conscious
-aspect of the design of Lisp under XEmacs is a clean separation between
-the external interface to a Lisp object's functionality and its internal
-implementation. Part of this design is that Lisp programs are
-forbidden from accessing the contents of the object other than through
-using a standard API. In this respect, XEmacs Lisp is similar to
-modern Lisp dialects but differs from GNU Emacs, which tends to expose
-the implementation and allow Lisp programs to look at it directly. The
-major advantage of hiding the implementation is that it allows the
-implementation to be redesigned without affecting any Lisp programs,
-including those that might want to be "clever" by looking directly at
-the object's contents and possibly manipulating them.)
-
- Moving code into Lisp makes the code easier to debug and maintain and
-makes it much easier for people who are not XEmacs developers to
-customize XEmacs, because they can make a change with much less chance
-of obscure and unwanted interactions occurring than if they were to
-change the C code.
-