| advertise add site services publishers database health videos | ![]() | about toolbar stats live show health store more stuff JOIN/LOGIN |
Preschool Language Program - Speech-Language Pathology Program -... childrenshospital.org | ACSRD: Awards Scheme | Clinical Excellence Awards Scheme restdent.org.uk |
Scheme is one of the two main dialects of the programming language Lisp. Unlike Common Lisp, the other main dialect, Scheme follows a minimalist design philosophy specifying a small standard core with powerful tools for language extension. Its compactness and elegance have made it popular with educators, language designers, programmers, implementors, and hobbyists, and this diverse appeal is seen as both a strength and, because of the diversity of its constituencies and the wide divergence between implementations, one of its weaknesses.[1] Scheme was developed at the MIT AI Lab by Guy L. Steele and Gerald Jay Sussman who introduced it to the academic world via a series of memos, now referred to as the Lambda Papers, over the period 1975-1980. The Scheme language is standardized in the official IEEE standard[2], and a de facto standard called the Revisedn Report on the Algorithmic Language Scheme (RnRS). The most widely implemented standard is R5RS (1998),[3] and a new standard R6RS [4] was ratified in 2007.[5] Scheme was the first dialect of Lisp to choose lexical scope and the first to require compilers to perform tail-call optimization. It was also one of the first programming languages to support first-class continuations. It had a significant influence on the effort that led to the development of its sister, Common Lisp.[6] [edit] OriginMain article: History of the Scheme programming language Scheme started as an attempt to understand Carl Hewitt's Actor model, for which purpose Steele and Sussman wrote a "tiny Lisp interpreter" using Maclisp and then "added mechanisms for creating actors and sending messages."[7] Scheme was originally called "Schemer", in the tradition of other Lisp-derived languages like Planner or Conniver. The current name resulted from the authors' use of the ITS operating system, which limited filenames to two components of at most six characters each. Currently, "Schemer" is commonly used to refer to a Scheme programmer. [edit] Distinguishing featuresSee also: Lisp (programming language) Scheme shares many characteristics with other members of the Lisp programming language family: simple s-expression-based syntax, close equivalence between source code and data formats (homoiconicity), dynamically typed variables, list-processing primitives such as This section concentrates mainly on innovative features of the language, including those features that distinguish Scheme from other Lisps. Unless stated otherwise, descriptions of features relate to R5RS. In examples provided in this section, the notation "===> result" is used to indicate the result of evaluating the expression on the immediately preceding line. This is the same convention used in R5RS. [edit] Fundamental design featuresThis subsection describes those features of Scheme that have distinguished it from other programming languages from its earliest days. These are the aspects of Scheme that most strongly influence any product of the Scheme language, and they are the aspects that all versions of the Scheme programming language, from 1973 onward, share. [edit] MinimalismScheme is a very simple language, much easier to implement than any language of comparable power.[8] This ease is attributable to the use of lambda calculus to derive much of the syntax of the language from more primitive forms. For instance of the 23 s-expression-based syntactic constructs defined in the R5RS Scheme standard, 11 are classed as derived or library forms, which can be written as macros involving more fundamental forms, principally lambda. As R5RS says (R5RS sec. 3.1): "The most fundamental of the variable binding constructs is the lambda expression, because all other variable binding constructs can be explained in terms of lambda expressions." [3]
Example: a macro to implement (define-syntax let (syntax-rules () ((let ((var expr) ...) body ...) ((lambda (var ...) body ...) expr ...)))) Thus using In 1998 Sussman and Steele remarked that the minimalism of Scheme was not a conscious design goal, but rather the unintended outcome of the design process. "We were actually trying to build something complicated and discovered, serendipitously, that we had accidentally designed something that met all our goals but was much simpler than we had intended..we realized that the lambda calculus--a small, simple formalism—could serve as the core of a powerful and expressive programming language. "[7] [edit] Lexical scopeSee also: Scope (programming) Like most modern programming languages and unlike earlier Lisps such as Maclisp and unlike Emacs Lisp, Scheme is lexically scoped: all possible variable bindings in a program unit can be analyzed by reading the text of the program unit without consideration of the contexts in which it may be called. This contrasts with dynamic scoping which was characteristic of early Lisp dialects because of the processing costs associated with the primitive textual substitution methods used to implement lexical scoping algorithms in compilers and interpreters of the day. In those Lisps, it was perfectly possible for a reference to a free variable inside a procedure to refer to quite distinct bindings external to the procedure depending on the context of the call. The impetus to incorporate what was, in the early 1970s, an unusual scoping model into their new version of Lisp came from Sussman's studies of ALGOL, He suggested that ALGOL-like lexical scoping mechamisms would help to realise their initial goal of implementing Hewitt's Actor model in Lisp.[7] The key insights on how to introduce lexical scoping into a Lisp dialect were popularized in Sussman and Steele's 1975 Lambda Paper , "Scheme: An Interpreter for Extended Lambda Calculus",[9] where they adopted the concept of the lexical closure, which had been described in an AI Memo in 1970 by Joel Moses, who attributed the idea to Peter J. Landin.[10] [edit] Lambda calculusSee also: Lambda calculus Alonzo Church's mathematical notation, the lambda calculus, has inspired Lisp's use of "lambda" as a keyword for introducing a procedure, as well as influencing the development of functional programming techniques involving the use of higher-order functions in Lisp. But early Lisps were not suitable expressions of the lambda calculus because of their treatment of free variables.[7] The introduction of lexical scope resolved the problem by making an equivalence between some forms of lambda notation and their practical expression in a working programming language. Sussman and Steele showed that the new language could be used to elegantly derive all the imperative and declarative semantics of other programming languages including ALGOL and Fortran, and the dynamic scope of other Lisps, by using lambda expressions not as simple procedure instantiations but as "control structures and environment modifiers." [11] They introduced continuation-passing style along with their first description of Scheme in the first of the Lambda Papers, and in subsequent papers they proceeded to demonstrate the raw power of this practical use of lambda calculus. [edit] Block structureScheme inherits its block structure from earlier block structured languages, particularly ALGOL. In Scheme blocks are implemented by three binding constructs: (define var "goose") ;; Any reference to var here will be bound to "goose" (let ((var 10)) ;; statements go here. Any reference to var here will be bound to 10. ) ;; Any reference to var here will be bound to "goose" Blocks can be nested to create arbitrarily complex block structures according to the need of the programmer. The use of block structuring to create local bindings alleviates the risk of namespace collision that can otherwise occur. One variant of (let* ((var1 10) (var2 (+ var1 12))) ;; But the definition of var1 could not refer to var2 ) The other variant, ;; Tabulation of Hofstadter's male and female sequences (letrec ((female (lambda(n) (if (= n 0) 1 (- n (male (female (- n 1))))))) (male (lambda(n) (if (= n 0) 0 (- n (female (male (- n 1)))))))) (display "i male(i) female(i)")(newline) (do ((i 0 (+ i 1))) ((> i 8) #f) (display i) (display " ")(display (male i))(display " ")(display (female i)) (newline))) (See Hofstadter's male and female sequences for the definitions used in this example) All procedures bound in a single A variant of Example: a simple counter (let loop ((n 1)) (if (<= n 10) (begin (display n)(newline) (loop (+ n 1)))) Like any procedure in Scheme the procedure created in the named let is a first class object. [edit] Proper tail recursionFor more details on this topic, see Tail recursion. Scheme has an iteration construct, ;; Tabulation of squares from 0 to 9: ;; Note: loop is simply an arbitrary symbol used as a label. Any symbol will do. (let loop ((i 0)) (if (not (= i 10)) (begin (display i)(display " squared = ")(display (* i i))(newline) (loop (+ i 1))))) [edit] First-class continuationsMain article: continuation Continuations in Scheme are first-class objects. Scheme provides the procedure The following example, a traditional programmer's puzzle, shows that Scheme can handle continuations as first-class objects, binding them to variables and passing them as arguments to procedures. (let* ((yin ((lambda (cc) (display "@") cc) (call-with-current-continuation (lambda (c) c)))) (yang ((lambda (cc) (display "*") cc) (call-with-current-continuation (lambda (c) c)))) ) (yin yang)) When executed this code displays a counting sequence: "@*@**@***@****@*****@******@*******@********..." In the R5RS standard the concept of the first class continuation was extended. A limitation of The effect of this is to enable the writing of procedures that return more than one value. A simple example of the usefulness of this powerful construct is as follows: ;; A procedure to return the username and the password (define (credentials) (values "myuser" "mypassword")) ;; A procedure to perform authentication of a username and password (define (login username password) ;; authentication and login code goes here ) ;; Send the credentials to the authentication procedure. (call-with-values credentials login) Using the (receive (username password) (credentials) (login username password)) The [edit]In contrast to Common Lisp, all data and procedures in Scheme share a common namespace, whereas in Common Lisp functions and data have separate namespaces making it possible for a function and a variable to have the same name, and requiring special notation for referring to a function as a value. This is sometimes known as the "Lisp-1/Lisp-2" distinction, referring to the unified namespace of Scheme and the separate namespaces of Common Lisp.[13] In Scheme, the same primitives that are used to manipulate and bind data can be used to bind procedures. There is no equivalent of Common Lisp's ;; Variable bound to a number: (define f 10) f ===> 10 ;; Mutation (altering the bound value) (set! f (+ f f 6)) ===> 26 ;; Assigning a procedure to the same variable: (set! f (lambda (n) (+ n 12))) (f 6) ===> 18 ;; Assigning the result of an expression to the same variable: (set! f (f 1)) f ===> 13 ;; functional programming: (apply + '(1 2 3 4 5 6)) ===> 21 (set! f (lambda(n) (+ n 100))) (map f '(1 2 3)) ===> (101 102 103) [edit] Implementation standardsThis subsection documents design decisions that have been taken over the years which have given Scheme a particular character, but are not the direct outcomes of the original design. [edit] Numerical towerMain article: Numerical tower Scheme specifies a comparatively full set of numerical datatypes including complex and rational types, which is known in Scheme as the numerical tower. (R5RS sec. 6.2 [3]) The standard treats these as abstractions and does not commit the implementor to a particular internal representation. Numbers may have the quality of exactness. An exact number can only be produced by a sequence of exact operations involving other exact numbers--inexactness is thus contagious. The standard specifies that any two implementations must produce equivalent results for all operations resulting in exact numbers. The R5RS standard specifies procedures At R5RS standard. Scheme implementations are not required to implement the whole numerical tower but they must implement "a coherent subset consistent with both the purposes of the implementation and the spirit of the Scheme language." (R5RS sec. 6.2.3).[3] The new R6RS standard does require implementation of the whole tower and "exact integer objects and exact rational number objects of practically unlimited size and precision, and to implement certain procedures...so they always return exact results when given exact arguments" (R6RS sec. 3.4, sec. 11.7.1).[4] Example 1: exact arithmetic in an implementation that supports exact rational complex numbers. ;; Sum of three rational real numbers and two rational complex numbers (define x (+ 1/3 1/4 -1/5 -1/3i 405/50+2/3i)) x ===> 509/60+1/3i ;; Check for exactness. (exact? x)) ===> #t Example 2: Same arithmetic in an implementation that supports neither exact rational numbers nor complex numbers but does accept real numbers in rational notation. ;; Sum of four rational real numbers (define xr (+ 1/3 1/4 -1/5 405/50)) ;; Sum of two rational real numbers (define xi (+ -1/3 2/3)) xr ===> 8.48333333333333 xi ===> 0.333333333333333 ;; Check for exactness. (exact? xr)) ===> #f (exact? xi)) ===> #f Both implementations conform to the R5RS standard but the second does not conform to R6RS because it does not implement the full numerical tower. [edit] Delayed evaluationSee also: Lazy evaluation Scheme supports delayed evaluation through the (define a 10) (define eval-aplus2 (delay (+ a 2))) (set! a 20) (force eval-aplus2) ===> 22 (define eval-aplus50 (delay (+ a 50))) (let ((a 8)) (force eval-aplus50)) ===> 70 (set! a 100) (force eval-aplus2) ===> 22 The lexical context of the original definition of the promise is preserved, and its value is also preserved after the first use of These primitives, which produce or handle values known as promises, can be used to implement advanced lazy evaluation constructs such as streams. [14] In the R6RS standard, these are no longer primitives but instead are provided as part of the R5RS compatibility library (rnrs r5rs (6)). In R5RS, a suggested implementation of SRFI 41 enables the expression of both finite and infinite sequences with extraordinary economy. For example this is a definition of the fibonacci sequence using the functions defined in SRFI 41:[14] ;; Define the Fibonacci sequence: (define fibs (stream-cons 0 (stream-cons 1 (stream-map + fibs (stream-cdr fibs))))) ;; Compute the hundredth number in the sequence: (stream-ref fibs 99) ===> 218922995834555169026 [edit] Order of evaluation of procedure argumentsMost Lisps specify an order of evaluation for procedure arguments. Scheme does not. Order of evaluation--including the order in which the expression in the operator position is evaluated--may be chosen by the compiler on a call-by-call basis, and the only constraint is that "the effect of any concurrent evaluation of the operator and operand expressions is constrained to be consistent with some sequential order of evaluation." (R5RS sec. 4.1.3) [3] (let ((ev (lambda(n) (display "Evaluating ") (display (if (procedure? n) "procedure" n)) (newline) n))) ((ev +) (ev 1) (ev 2))) ===> 3 ev is a procedure that describes the argument passed to it, then returns the value of the argument. In contrast with other Lisps, the appearance of an expression in the operator position (the first item) of a Scheme expression is quite legal, as long as the result of the expression in the operator position is a procedure. In calling the procedure "+" to add 1 and 2, the expressions (ev +), (ev 1) and (ev 2) may be evaluated in any order, as long as the effect is not as if they were evaluated in parallel. Thus the following three lines may be displayed in any order by standard Scheme when the above example code is executed, although the text of one line may not be interleaved with another because that would violate the sequential evaluation constraint.
[edit] Hygienic macrosMain article: hygienic macro The R5RS standard introduced a powerful hygienic macro system that allows the programmer to add new syntactic constructs to the language using a simple pattern matching sublanguage. (R5RS sec 4.3)[3] Prior to this the hygienic macro system had been relegated to an appendix of the R4RS standard, as a "high level" system alongside a "low level" macro system, both of which were treated as extensions to Scheme rather than an essential part of the language.[15] Implementations of the hygienic macro system, also called ;; Define a macro to implement a variant of "if" with a multi-expression ;; true branch and no false branch. (define-syntax when (syntax-rules () ((when t e ...) (if t (begin e ...)) Thus the syntax of Scheme can easily be extended. Invocations of macros and procedures bear a close resemblance--both are s-expressions--but they are treated differently. When the compiler encounters an s-expression in the program it first checks to see if the symbol is defined as a syntactic keyword within the current lexical scope. If so it then attempts to expand the macro treating the items in the tail of the s-expression as arguments without compiling code to evaluate them, and this process is repeated recursively until no macro invocations remain. If it is not a syntactic keyword, the compiler compiles code to evaluate the arguments in the tail of the s-expression and then to evaluate the variable represented by the symbol at the head of the s-expression and call it as a procedure with the evaluated tail expressions passed as actual arguments to it. Most Scheme implementations also provide a second macro system similar to that provided in Common Lisp. [edit] Environments and evalPrior to R5RS, Scheme had no standard equivalent of the The reason for this confusion is that in Scheme with its lexical scoping the result of evaluating an expression depends on where it is evaluated. For instance, it is not clear whether the result of evaluating the following expression should be 5 or 6:[16] (let ((name '+)) (let ((+ *)) (evaluate (list name 2 3)))) If it is evaluated in the outer environment, where R5RS resolves this confusion by specifying three procedures that return environments, and providing a procedure [edit] Treatment of non-boolean values in boolean expressionsIn most dialects of Lisp including Common Lisp, by convention the value Where the constant representing the boolean value of true is [edit] Disjointness of primitive datatypesIn Scheme the primitive datatypes are disjoint. Only one of the following predicates can be true of any Scheme object: Within the numerical datatype, by contrast, the numerical values overlap. An integer value satisfies the predicate [edit] Equivalence predicatesSee also: relational operator Scheme has three different types of equivalence between arbitrary objects denoted by three different equivalence predicates, relational operators for testing equality,
Type dependent equivalence operations also exist in Scheme: [edit] CommentsSee also: Comment (computer programming) Up to the R5RS standard, the standard comment in Scheme was a semicolon, which makes the rest of the line invisible to Scheme. Numerous implementations have supported alternative conventions permitting comments to extend for more than a single line, and the R6RS standard permits two of them: an entire s-expression may be turned into a comment (or "commented out") by preceding it with [edit] Input/outputScheme's input and output is based on the port datatype. (R5RS sec 6.6) [3] R5RS defines two default ports, accessible with the procedures The following examples are written in strict R5RS Scheme. Example 1: With output defaulting to (current-output-port): (let ((hello0 (lambda() (display "Hello world")(newline)))) (hello0)) Example 2: As 1, but using optional port argument to output procedures (let ((hello1 (lambda (p) (display "Hello world" p)(newline p)))) (hello1 (current-output-port))) Example 3: As 1, but output is redirected to a newly created file ;; NB: with-output-to-file is an optional procedure in R5RS (let ((hello0 (lambda () (display "Hello world")(newline)))) (with-output-to-file "helloworldoutputfile" hello0)) Example 4: As 2, but with explicit file open and port close to send output to file (let ((hello1 (lambda (p) (display "Hello world" p)(newline p))) (output-port (open-output-file "helloworldoutputfile"))) (hello1 output-port) (close-output-port output-port)) Example 5: As 2, but with using call-with-output-file to send output to a file. (let ((hello1 (lambda (p) (display "Hello world" p)(newline p)))) (call-with-output-file "helloworldoutputfile" hello1)) Similar procedures are provided for input. R5RS Scheme provides the predicates In addition to the standard, SRFI 28 defines a basic formatting procedure resembling Common Lisp's [edit] Redefinition of standard proceduresIn Scheme procedures are bound to variables. At R5RS the language standard formally mandated that programs may change the variable bindings of built-in procedures, effectively redefining them. (R5RS "Language changes")[3] (let ((call/cc (lambda(x) (display "Trace: entered call/cc")(newline) (let ((c (call/cc x))) (display "Trace: finished call/cc")(newline) c)))) (call/cc (lambda (r) (r 1)))) ===> 1 Whenever [edit] Nomenclature and naming conventionsIn Standard Scheme, procedures that convert from one datatype to another contain the character string "->" in their name, predicates end with a "?", and procedures that change the value of already-allocated data end with a "!". These conventions are often followed by Scheme programmers. In formal contexts such as Scheme standards, the word "procedure" is used in preference to "function" to refer to a lambda expression or primitive procedure. In normal usage the words "procedure" and "function" are used interchangeably. Procedure application is sometimes referred to formally as combination. As in other Lisps, the term "thunk" is used in Scheme to refer to a procedure with no arguments. The term "proper tail recursion" refers to the property of all Scheme compilers, that they perform tail-call optimization so as to support an indefinite number of active tail calls. The form of the titles of the standards documents since R3RS, "Revisedn Report on the Algorithmic Language Scheme" is a reference to the title of the ALGOL 60 standard document, "Revised Report on the Algorithmic Language Algol 60," The Summary page of R3RS is closely modeled on the Summary page of the ALGOL 60 Report. [20][21] [edit] Review of language syntaxThe syntax of Scheme is formally defined in the standards R5RS (1998) and R6RS (2007). They describe standard "forms": keywords and accompanying syntax, which provide the control structure of the language, and standard procedures which perform common tasks. [edit] Standard formsThis table describes the standard forms in Scheme. Some forms appear in more than one row because they cannot easily be classified into a single function in the language. Forms marked "L" in this table are classed as derived "library" forms in the standard and are often implemented as macros using more fundamental forms in practice, making the task of implementation much easier than in other languages.
[edit] Standard proceduresThe following two tables describe the standard procedures in R5RS Scheme. R6RS is far more extensive and a summary of this type would not be practical. Some procedures appear in more than one row because they cannot easily be classified into a single function in the language.
String and character procedures that contain "-ci" in their names perform case-independent comparisons between their arguments: upper case and lower case versions of the same character are taken to be equal.
Implementations of - and / that take more than two arguments are defined but left optional at R5RS. [edit] Scheme Requests for Implementation - portable extensions to the standardMain article: Scheme Requests for Implementation Because of Scheme's minimalism, many common procedures and syntactic forms are not defined by the standard. In order to keep the core language small but facilitate standardization of extensions, the Scheme community has a "Scheme Request for Implementation" (SRFI) process by which extension libraries are defined through careful discussion of extension proposals. This promotes code portability. Many of the SRFIs are supported by all or most Scheme implementations. SRFIs with fairly wide support in different implementations include [22]:
A full list of accepted (finalized) SRFIs is available at http://srfi.schemers.org/final-srfis.html [edit] Implementations
The elegant, minimalist design has made Scheme a popular target for language designers, hobbyists, and educators, and because of the small size of a typical interpreter it is also a popular choice for embedded systems and scripting. This has resulted in scores of implementations.[23] most of which differ from each other so much that porting programs from one implementation to another is quite difficult and the small size of the standard language means that writing a useful program of any great complexity in standard, portable Scheme is almost impossible. The R6RS standard specifies a much broader language in an attempt to broaden its appeal to programmers. Almost all implementations provide a traditional Lisp-style read-eval-print loop for development and debugging. Most also compile Scheme programs to executable binary. Support for embedding Scheme code in programs written in other languages is also common, as the relative simplicity of Scheme implementations make Scheme a popular choice for adding scripting capabilities to larger systems developed in languages such as C. Gambit, Chicken and Bigloo work by compiling Scheme to C, which makes embedding particularly easy. In addition, Bigloo's compiler can be configured to generate JVM bytecode, and it also features an experimental bytecode generator for .Net. Some implementations support additional features. For example, Kawa and JScheme provide integration with Java classes, and the Scheme to C compilers often make it easy to use external libraries written in C, up to allowing the embedding of actual C code in the Scheme source. Another example is PVTS which offers a set of visual tools for supporting the learning of Scheme. [edit] R6RSA new language standardization process began at the 2003 Scheme workshop, with the goal of producing an R6RS standard in 2006. This process broke with the earlier RnRS approach of unanimity. R6RS features a standard module system, allowing a split between the core language and libraries. A number of drafts of the R6RS specification were released, the final version being R5.97RS. A successful vote resulted in the ratification of the new standard, announced on August 28, 2007.[4] Currently the newest releases of various Scheme implementations, e.g. Ikarus, Larceny, PLT Scheme and Ypsilon support the R6RS standard. There is a portable reference implementation of the proposed implicitly-phased libraries for R6RS, called psyntax, which loads and bootstraps itself properly on various older Scheme implementations.[24] R6RS introduces numerous significant changes to the language. [25] The source code is now specified in Unicode, and a large subset of unicode characters may now appear in Scheme symbols and identifiers, and there are other minor changes to the lexical rules. Character data is also now specified in Unicode. Many standard procedures have been moved to the new standard libraries, which themselves form a large expansion of the standard, containing procedures and syntactic forms that were formerly not part of the standard. Supporting the libraries and the production of further libraries. A new module system has been introduced, and systems for exception handling are now standardized. Syntax-rules has been replaced with a more expressive syntactic abstraction facility (syntax-case) which allows the use of all of Scheme at macro expansion time. Compliant implementations are now required to support Scheme's full numeric tower, and the semantics of numbers have been expanded, mainly in the direction of support for the IEEE 754 standard for floating point numerical representation. The new standard has caused controversy because it is seen to have departed from the minimalist philosophy.[26] [27] In August, 2009, the Scheme Steering Committee which oversees the standardization process announced its intention to recommend splitting Scheme into two languages: a large modern programming language for programmers, and a subset of the large version retaining the minimalism prized by educators and casual implementors. [1] [edit] UsageScheme is widely used by a number[28] of schools; in particular, a number of introductory Computer Science courses use Scheme in conjunction with the textbook Structure and Interpretation of Computer Programs (SICP).[29] For the past 12 years, PLT has run the TeachScheme! project, which has exposed close to 600 high school teachers and thousands of high school students to rudimentary Scheme programming. MIT's old introductory programming class 6.001 was taught in Scheme,[30] Although 6.001 has been replaced by more modern courses, SICP continues to be taught at MIT. [31] Caltech's introductory computer course CS1 is taught using Scheme. Indiana University's introductory class, C211, is taught entirely in Scheme. The introductory class at UC Berkeley, CS 61A, is taught entirely in Scheme, save minor diversions into Logo to demonstrate dynamic scope; all course materials, including lecture webcasts, are available online free of charge.[32] The introductory computer science courses at Yale and Grinnell College are also taught in Scheme.[33] Several introductory Computer Science courses at Rice University are also taught in Scheme.[34] Programming Design Paradigms,[35] a mandatory course for the Computer science Graduate Students at Northeastern University, also extensively uses Scheme. LambdaBeans [36] is an open source Scheme editor, helping with syntax coloring, code completion, and other features typical to code editors. Although there are relatively few examples of Scheme in apparent usage[37] for non-pedagogical purposes, the Document Style Semantics and Specification Language (DSSSL), which provides a method of specifying SGML stylesheets, uses a Scheme subset.[38] In addition, the well-known open source raster graphics editor GIMP uses Scheme as a scripting language.[39] Guile has been adopted by GNU project as its official scripting language, and that implementation of Scheme is embedded in such applications as GNU LilyPond and GnuCash as a scripting language for extensions. Likewise, Guile used to be the scripting language for the desktop environment GNOME[40], and GNOME still has a project that provides Guile bindings to its library stack[41]. Elk Scheme is used by Synopsys as a scripting language for its technology CAD (TCAD) tools.[42] Shiro Kawai, senior programmer on the movie Final Fantasy: The Spirits Within, used Scheme as a scripting language for managing the real-time rendering engine.[43] Google's App Inventor for Android uses Scheme. Kawa is used to compile the Scheme code down to byte-codes for the Java Virtual Machine running on Android devices. [44] [edit] See also
[edit] References
[edit] Further reading
[edit] External links
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ↑ top of page ↑ | about thumbshots |