123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- @c -*-texinfo-*-
- @c This is part of the GNU Guile Reference Manual.
- @c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2010, 2016,
- @c 2017, 2018 Free Software Foundation, Inc.
- @c See the file guile.texi for copying conditions.
- @node Other Languages
- @section Support for Other Languages
- In addition to Scheme, a user may write a Guile program in an increasing
- number of other languages. Currently supported languages include Emacs
- Lisp and ECMAScript.
- Guile is still fundamentally a Scheme, but it tries to support a wide
- variety of language building-blocks, so that other languages can be
- implemented on top of Guile. This allows users to write or extend
- applications in languages other than Scheme, too. This section describes
- the languages that have been implemented.
- (For details on how to implement a language, @xref{Compiling to the
- Virtual Machine}.)
- @menu
- * Using Other Languages:: How to use other languages.
- * Emacs Lisp:: The dialect of Lisp used in Emacs.
- * ECMAScript:: As seen on television.
- @end menu
- @node Using Other Languages
- @subsection Using Other Languages
- There are currently only two ways to access other languages from within
- Guile: at the REPL, and programmatically, via @code{compile},
- @code{read-and-compile}, and @code{compile-file}.
- The REPL is Guile's command prompt (@pxref{Using Guile Interactively}).
- The REPL has a concept of the ``current language'', which defaults to
- Scheme. The user may change that language, via the meta-command
- @code{,language}.
- For example, the following meta-command enables Emacs Lisp input:
- @example
- scheme@@(guile-user)> ,language elisp
- Happy hacking with Emacs Lisp! To switch back, type `,L scheme'.
- elisp@@(guile-user)> (eq 1 2)
- $1 = #nil
- @end example
- Each language has its short name: for example, @code{elisp}, for Elisp.
- The same short name may be used to compile source code programmatically,
- via @code{compile}:
- @example
- elisp@@(guile-user)> ,L scheme
- Happy hacking with Guile Scheme! To switch back, type `,L elisp'.
- scheme@@(guile-user)> (compile '(eq 1 2) #:from 'elisp)
- $2 = #nil
- @end example
- Granted, as the input to @code{compile} is a datum, this works best for
- Lispy languages, which have a straightforward datum representation.
- Other languages that need more parsing are better dealt with as strings.
- The easiest way to deal with syntax-heavy language is with files, via
- @code{compile-file} and friends. However it is possible to invoke a
- language's reader on a port, and then compile the resulting expression
- (which is a datum at that point). For more information,
- @xref{Compilation}.
- For more details on introspecting aspects of different languages,
- @xref{Compiler Tower}.
- @node Emacs Lisp
- @subsection Emacs Lisp
- Emacs Lisp (Elisp) is a dynamically-scoped Lisp dialect used in the
- Emacs editor. @xref{top,,Overview,elisp,Emacs Lisp}, for more
- information on Emacs Lisp.
- We hope that eventually Guile's implementation of Elisp will be good
- enough to replace Emacs' own implementation of Elisp. For that reason,
- we have thought long and hard about how to support the various features
- of Elisp in a performant and compatible manner.
- Readers familiar with Emacs Lisp might be curious about how exactly
- these various Elisp features are supported in Guile. The rest of this
- section focuses on addressing these concerns of the Elisp elect.
- @menu
- * Nil:: A third boolean.
- * Dynamic Binding:: Threadsafe bindings with fluids.
- * Other Elisp Features:: Miscellany.
- @end menu
- @node Nil
- @subsubsection Nil
- @code{nil} in ELisp is an amalgam of Scheme's @code{#f} and @code{'()}.
- It is false, and it is the end-of-list; thus it is a boolean, and a list
- as well.
- Guile has chosen to support @code{nil} as a separate value, distinct
- from @code{#f} and @code{'()}. This allows existing Scheme and Elisp
- code to maintain their current semantics. @code{nil}, which in Elisp
- would just be written and read as @code{nil}, in Scheme has the external
- representation @code{#nil}.
- In Elisp code, @code{#nil}, @code{#f}, and @code{'()} behave like
- @code{nil}, in the sense that they are all interpreted as @code{nil} by
- Elisp @code{if}, @code{cond}, @code{when}, @code{not}, @code{null}, etc.
- To test whether Elisp would interpret an object as @code{nil} from
- within Scheme code, use @code{nil?}:
- @deffn {Scheme Procedure} nil? obj
- Return @code{#t} if @var{obj} would be interpreted as @code{nil} by
- Emacs Lisp code, else return @code{#f}.
- @lisp
- (nil? #nil) @result{} #t
- (nil? #f) @result{} #t
- (nil? '()) @result{} #t
- (nil? 3) @result{} #f
- @end lisp
- @end deffn
- This decision to have @code{nil} as a low-level distinct value
- facilitates interoperability between the two languages. Guile has chosen
- to have Scheme deal with @code{nil} as follows:
- @example
- (boolean? #nil) @result{} #t
- (not #nil) @result{} #t
- (null? #nil) @result{} #t
- @end example
- And in C, one has:
- @example
- scm_is_bool (SCM_ELISP_NIL) @result{} 1
- scm_is_false (SCM_ELISP_NIL) @result{} 1
- scm_is_null (SCM_ELISP_NIL) @result{} 1
- @end example
- In this way, a version of @code{fold} written in Scheme can correctly
- fold a function written in Elisp (or in fact any other language) over a
- nil-terminated list, as Elisp makes. The converse holds as well; a
- version of @code{fold} written in Elisp can fold over a
- @code{'()}-terminated list, as made by Scheme.
- On a low level, the bit representations for @code{#f}, @code{#t},
- @code{nil}, and @code{'()} are made in such a way that they differ by
- only one bit, and so a test for, for example, @code{#f}-or-@code{nil}
- may be made very efficiently. See @code{libguile/boolean.h}, for more
- information.
- @subsubheading Equality
- Since Scheme's @code{equal?} must be transitive, and @code{'()}
- is not @code{equal?} to @code{#f}, to Scheme @code{nil} is not
- @code{equal?} to @code{#f} or @code{'()}.
- @example
- (eq? #f '()) @result{} #f
- (eq? #nil '()) @result{} #f
- (eq? #nil #f) @result{} #f
- (eqv? #f '()) @result{} #f
- (eqv? #nil '()) @result{} #f
- (eqv? #nil #f) @result{} #f
- (equal? #f '()) @result{} #f
- (equal? #nil '()) @result{} #f
- (equal? #nil #f) @result{} #f
- @end example
- However, in Elisp, @code{'()}, @code{#f}, and @code{nil} are all
- @code{equal} (though not @code{eq}).
- @example
- (defvar f (make-scheme-false))
- (defvar eol (make-scheme-null))
- (eq f eol) @result{} nil
- (eq nil eol) @result{} nil
- (eq nil f) @result{} nil
- (equal f eol) @result{} t
- (equal nil eol) @result{} t
- (equal nil f) @result{} t
- @end example
- These choices facilitate interoperability between Elisp and Scheme code,
- but they are not perfect. Some code that is correct standard Scheme is
- not correct in the presence of a second false and null value. For
- example:
- @example
- (define (truthiness x)
- (if (eq? x #f)
- #f
- #t))
- @end example
- This code seems to be meant to test a value for truth, but now that
- there are two false values, @code{#f} and @code{nil}, it is no longer
- correct.
- Similarly, there is the loop:
- @example
- (define (my-length l)
- (let lp ((l l) (len 0))
- (if (eq? l '())
- len
- (lp (cdr l) (1+ len)))))
- @end example
- Here, @code{my-length} will raise an error if @var{l} is a
- @code{nil}-terminated list.
- Both of these examples are correct standard Scheme, but, depending on
- what they really want to do, they are not correct Guile Scheme.
- Correctly written, they would test the @emph{properties} of falsehood or
- nullity, not the individual members of that set. That is to say, they
- should use @code{not} or @code{null?} to test for falsehood or nullity,
- not @code{eq?} or @code{memv} or the like.
- Fortunately, using @code{not} and @code{null?} is in good style, so all
- well-written standard Scheme programs are correct, in Guile Scheme.
- Here are correct versions of the above examples:
- @example
- (define (truthiness* x)
- (if (not x)
- #f
- #t))
- ;; or: (define (t* x) (not (not x)))
- ;; or: (define (t** x) x)
- (define (my-length* l)
- (let lp ((l l) (len 0))
- (if (null? l)
- len
- (lp (cdr l) (1+ len)))))
- @end example
- This problem has a mirror-image case in Elisp:
- @example
- (defun my-falsep (x)
- (if (eq x nil)
- t
- nil))
- @end example
- Guile can warn when compiling code that has equality comparisons with
- @code{#f}, @code{'()}, or @code{nil}. @xref{Compilation}, for details.
- @node Dynamic Binding
- @subsubsection Dynamic Binding
- In contrast to Scheme, which uses ``lexical scoping'', Emacs Lisp scopes
- its variables dynamically. Guile supports dynamic scoping with its
- ``fluids'' facility. @xref{Fluids and Dynamic States}, for more
- information.
- @node Other Elisp Features
- @subsubsection Other Elisp Features
- Buffer-local and mode-local variables should be mentioned here, along
- with buckybits on characters, Emacs primitive data types, the
- Lisp-2-ness of Elisp, and other things. Contributions to the
- documentation are most welcome!
- @node ECMAScript
- @subsection ECMAScript
- @url{http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf,ECMAScript}
- was not the first non-Schemey language implemented by Guile, but it was
- the first implemented for Guile's bytecode compiler. The goal was to
- support ECMAScript version 3.1, a relatively small language, but the
- implementor was completely irresponsible and got distracted by other
- things before finishing the standard library, and even some bits of the
- syntax. So, ECMAScript does deserve a mention in the manual, but it
- doesn't deserve an endorsement until its implementation is completed,
- perhaps by some more responsible hacker.
- In the meantime, the charitable user might investigate such invocations
- as @code{,L ecmascript} and @code{cat test-suite/tests/ecmascript.test}.
- @c Local Variables:
- @c TeX-master: "guile.texi"
- @c End:
|