git.fiddlerwoaroof.com
Raw Blame History
Syntax
------

(quote x)

(function name)
  You must use this to reference a global function, as in CL.  (There
  isn't a local function namespace.)

(lambda lambda-list . body)
  Equivalent to #'(lambda ...) in Common Lisp.
  The lambda-list can be dotted, as in Scheme.  CL lambda-list keywords
  are not supported.

function call
  Order of evaluation is unspecified, as in Scheme.
  You have to use FUNCALL if the function is bound with let.

(funcall function . args)
  As in Common Lisp, but might be a macro.  (The function is guaranteed
  to be a true function, not a symbol.)

(apply procedure . args)
  As in Common Lisp/Scheme.

(map procedure . lists)
  As in Scheme.  Equivalent to MAPCAR in CL.

(for-each procedure . lists)
  As in Scheme.  Equivalent to MAPC in CL.

(every procedure . lists)
(some procedure . lists)
(notany procedure . lists)
(notevery procedure . lists)
  As in CL, but only work on lists.

(procedure? object)
  As in Scheme, but can return an arbitrary truth value instead of just #t.
  Note that we never use symbols or quoted lambda expressions as functions.

(if test then . maybe-else)
(when test . body)
(unless test . body)

(cond . tests)
  As in Scheme, but the = syntax isn't supported.  When no test is true, the
  result is undefined.

(case value . cases)
  As in Scheme.
  Stylistically, use this only when the case labels are symbols.

(and . expressions)
(or  . expressions)

(not value)
  As in Scheme but can return an arbitrary truth value instead of #t.

(set! variable value)
  As in Scheme; this doesn't return a useful value.  Use setf instead.

(setf place value)
  Similar to SETF in Common Lisp.  Returns value.
  See define-setf below.  Places that are macro calls are expanded
  if they don't have their own setter.
  Here is a list of the built-in setters:
    dynamic
    car
    cdr
    list-ref
    string-ref
    vector-ref
    table-entry

(let    bindings . body)
(let*   bindings . body)
(letrec bindings . body)
  Note that each binding clause must be a list of the form (var init);
  you can't just supply var or (var) as in Common Lisp.  Also remember
  that the order of evaluation for the init-forms is not specified for
  let/letrec.
  The Scheme named LET construct is not supported.

(flet   bindings . body)
(labels bindings . body)
  As in Common Lisp.

(dynamic-let bindings . body)
(dynamic name)
  As in Eulisp.  Dynamic-let is equivalent to bind in T, or LET in
  Common Lisp with all of the variables declared special.  As a matter
  of style, use dynamic to reference the value rather than just the name.

(begin . body)
  Like PROGN in Common Lisp.

(block name . body)
(return-from name result)
  The intersection of the Eulisp and Common Lisp definitions.  The "name" 
  may be bound as a lexical variable, but you should only refer to it
  inside a return-from.
  Don't depend on named functions (etc) establishing implicit blocks,
  as they do in CL.

(do bindings-and-steppers (end-test . results) . body)
  As in Scheme.  It doesn't necessarily establish an implicit BLOCK 
  as in CL so you can't RETURN from the loop.

(dolist (variable init . maybe-result) . body)
(dotimes (variable init . maybe-result) . body)
  As in CL, except you can't RETURN from the loop.

(values . values)
(multiple-value-bind variables values-expression . body)
  As in Common Lisp, except that the values-expression must explicitly
  return multiple values.

(let/cc variable . body)
  As in EuLisp.  This is the same as catch in T.  The continuation
  has dynamic extent within the body.
  You call the continuation with an arbitrary number of arguments, which
  are the multiple values to be returned.

(unwind-protect protected-form . body)

(declare ...)
  Similar to Common Lisp declare.  Declarations are allowed only in the
  standard places that Common Lisp permits (in particular, at the
  beginning of binding forms).  For now, only the following declarations
  are permitted:

  (ignore . variables)
  (ignorable . variables)
  (type type-spec . variables)  -- see info on type-specs below.




Definitions
-----------

(define pattern . value)
  As in Scheme.

(define-integrable pattern . value)
  Like DEFINE, but also tells the compiler to try to inline the value.

(define-syntax (name . lambda-list) . body)
  Similar to the equivalent T functionality.  The lambda-list does not
  support destructuring, as does Common Lisp's DEFMACRO.
  The macro definition is made both when the file is loaded and when it
  is compiled.

(define-local-syntax (name . lambda-list) . body)
  Again, similar to the T functionality.  In Common Lisp, equivalent to
  a DEFMACRO wrapped in (eval-when (compile) ...).  

(define-setf getter-name setter-name)
  Similar to the short form of DEFSETF in Common Lisp, except that the
  calling convention for the setter differs:  the value is passed as the
  first argument rather than as the last.  The setter must return this
  value.

(predefine pattern)
  This is a forward definition for a function or variable.  It doesn't
  actually make a definition; its purpose is to try to get rid of compiler
  warnings about calls to functions that haven't been defined yet.  It can
  be a no-op if the underlying Lisp system doesn't provide any way to do
  this.

(redefine pattern . value)
  Like DEFINE, but hints to the compiler not to complain if this 
  function/variable was previously defined somewhere else.

(redefine-syntax (name . lambda-list) . body)
  Like DEFINE-SYNTAX, but hints to the compiler not to complain if this
  macro was previously defined somewhere else.


Equivalence
-----------

(eq? x1 x2)
(eqv? x1 x2)
(equal? x1 x2)
  As in Scheme but can return an arbitrary truth value instead of #t.
  Note that equal? is not the same as EQUAL in CL because it descends vectors.
  eqv? is different from the T equiv? because it doesn't descent strings.


Lists
-----

(pair? x)
  As in Scheme but can return an arbitrary truth value instead of #t.

(cons x y)
(list . values)
(make-list length . maybe-init)

(cxxxxr x)

(null? x)
(list? x)
  As in Scheme but can return an arbitrary truth value instead of #t.
  Note that this is a check for a proper (null-terminated) list, not
  like LISTP in CL.

(length x)
(append list . more-lists)
(nconc list . more-lists)

(reverse x)
(nreverse x)

(list-tail list n)
  Like NTHCDR in Common Lisp.

(list-ref list n)
  Like NTH in Common Lisp.

(last list)
(butlast list)
  As in Common Lisp.

(memq object list)
(memv object list)
(member object list)

(assq object list)
(assv object list)
(assoc object list)

(push item place)
(pop place)
  As in Common Lisp.

(list-copy list)


Symbols
-------

(symbol? object)
(symbol->string object)
(string->symbol object)
(gensym . maybe-prefix)
(gensym? object)

(symbol-append . symbols)


Characters
----------

(char? object)
  As in Scheme, but can return an arbitrary truth value instead of just #t.  

(char=? c1 c2)
(char<? c1 c2)
(char>? c1 c2)
(char<=? c1 c2)
(char>=? c1 c2)
  As in Scheme, except that they can return an arbitrary truth value
  instead of just #t.

(char-ci=? c1 c2)
(char-ci<? c1 c2)
(char-ci>? c1 c2)
(char-ci<=? c1 c2)
(char-ci>=? c1 c2)
  As in Scheme, except that they can return an arbitrary truth value
  instead of just #t.

(char-alphabetic? c)
(char-numeric? c)
(char-whitespace? c)
(char-upper-case? c)
(char-lower-case? c)

(char->integer c)
(integer->char n)

(char-upcase c)
(char-downcase c)

(char-name c)
  As in Common Lisp.

(char->digit c . maybe-radix)
  Returns nil or the "weight" of the character as a fixnum in the given
  radix (defaults to 10).


Strings
-------

(string? object)
  As in Scheme, but can return an arbitrary truth value instead of just #t.

(make-string length . maybe-init)

(string char . more-chars)

(string-length string)
(string-ref string index)

(string=? s1 s2)
(string<? s1 s2)
(string>? s1 s2)
(string<=? s1 s2)
(string>=? s1 s2)
  As in Scheme, but can return an arbitrary truth value instead of just #t.

(string-ci=? s1 s2)
(string-ci<? s1 s2)
(string-ci>? s1 s2)
(string-ci<=? s1 s2)
(string-ci>=? s1 s2)
  As in Scheme, but can return an arbitrary truth value instead of just #t.

(substring string start end)
(string-append string . more-strings)

(string->list string)
(list->string list)

(string-copy string)

(string-upcase string)
(string-downcase string)


Vectors
-------

(vector? object)
  As in Scheme, but can return an arbitrary truth value instead of just #t.

(make-vector length . maybe-init)
(vector object . more-objects)

(vector-length vector)
(vector-ref vector index)
(vector->list vector)
(list->vector list)

(vector-copy vector)


Numbers
-------

(number? object)
  As in Scheme, but can return an arbitrary truth value instead of just #t.

(integer? object)
(rational? object)
(float? object)
  These test the representation of a number, not its mathematical 
  properties.  They're equivalent to the CL integerp, rationalp, and floatp
  predicates.  We ignore complex numbers for now.

(exact->inexact number)
  Convert an exact-rational to a float.

(= x1 x2)
(< x1 x2)
(> x1 x2)
(<= x1 x2)
(>= x1 x2)
  As in Scheme, except they can return an arbitrary truth value.
  They're restricted to being binary operators because that's all
  that's supported in T.

(zero? x)
(positive? x)
(negative? x)
  As in Scheme, except they can return an arbitrary truth value.

(min number . more-numbers)
(max number . more-numbers)

(+ . numbers)
(* . numbers)
(- n1 . more-numbers)
(/ n1 . more-numbers)
  As in Scheme.

(quotient n1 n2)
(remainder n1 n2)
(modulo n1 n2)
  quotient rounds towards zero.
  remainder has the sign of the second argument, modulo has the sign of
  the first argument.

(floor x)
(ceiling x)
(truncate x)
(round x)
  As in Scheme.  These return a number of the same type as the argument.

(floor->exact x)
(ceiling->exact x)
(truncate->exact x)
(round->exact x)
  Like the above, but return an exact-integer result.  Borrowed from
  MIT Scheme.

(1+ n)
(1- n)
(incf place . maybe-delta)
(decf place . maybe-delta)
  As in Common Lisp.

(number->string number . maybe-radix)
(string->number string . maybe-radix)
  As in Scheme.

(expt base power)
  As in Common Lisp.  [our only use is when both args are integers]


Tables
------

(table? object)
(make-table)
(table-entry table key)
(table-for-each proc table)
(copy-table table)
  More or less as in T.  For now we only bother with tables that use
  eq? as the comparison function -- mostly symbols are used as keys.
 

I/O
---

(call-with-input-file string proc)
(call-with-output-file string proc)
  As in Scheme.  The proc is called with one argument, the port.

(call-with-input-string string proc)
(call-with-output-string proc)
  Similar, but for reading/writing to a string stream string.
  Call-with-output-string returns the string.

(input-port? object)
(output-port? object)
  As in Scheme, but can return an arbitrary truth value.

(current-input-port)
(current-output-port)

(open-input-file filename)
(open-output-file filename)

(close-input-port port)
(close-output-port port)

(read . maybe-port)
(read-char . maybe-port)
(peek-char . maybe-port)
(read-line . maybe-port)

(eof-object? object)


Printer
-------

(internal-write object port)
(internal-output-width port)
(internal-output-position port)
(internal-write-char char port)
(internal-write-string string port start end)
(internal-newline port)
(internal-fresh-line port)
(internal-finish-output port)
(internal-force-output port)
(internal-clear-output port)
(internal-write-to-string object)
(internal-warning string)
(internal-error string)
  These are all internal hooks.  Don't use them directly if you can
  avoid it.

(write object . maybe-stream)
(print object . maybe-stream)
(prin1 object . maybe-stream)
(princ object . maybe-stream)
(pprint object . maybe-stream)
(prin1-to-string object)
(princ-to-string object)
(write-char char . maybe-stream)
(write-string string . maybe-stream-start-end)
(write-line string . maybe-stream-start-end)
(terpri . maybe-stream)
(fresh-line . maybe-stream)
(finish-output . maybe-stream)
(force-output . maybe-stream)
(clear-output . maybe-stream)
  These are the standard Common Lisp print functions.  All of them
  accept either a port or an XP stream as a stream argument.

(display object . maybe-stream)
  Same as princ; for Scheme compatibility.
(newline object . maybe-stream)
  Same as terpri; for Scheme compatibility.


*print-escape*
*print-shared*
*print-circle*
*print-pretty*
*print-level*
*print-length*
  These are the standard Common Lisp printer control variables.  The
  functions listed above obey them.

*print-base*
*print-radix*
*print-case*
*print-readably*
  These are more standard Common Lisp printer control variables, but
  support for them hasn't been implemented yet.  Maybe some day.

*print-dispatch*
  This is the hook for user customization of the printer.  Its value is a 
  function that is passed an object as an argument, and returns another
  function that takes a stream and the object as arguments.

*print-structure*
  If true, use standard structure printing syntax (overriding any special
  print function for the structure type).

*print-structure-slots*
  If true, recursively print structure slots when using standard structure
  printing syntax; otherwise just print the structure type name.


(standard-print-dispatch object)
  This function is the initial value of *print-dispatch*.

*print-right-margin*
*print-miser-width*
*print-lines*
*default-right-margin*
*last-abbreviated-printing*
  These are the XP pretty-printer control variables.  For more information
  about the pretty-printer, read the XP document.

(pprint-newline kind . maybe-stream)
  The kind argument can be one of LINEAR, FILL, MISER, or MANDATORY.

(pprint-logical-block (stream-symbol list . more-options) . body)
  This is a macro.  The body should contain code for printing a logical
  block to the stream stream-symbol.

  The format of the options is (stream-symbol list prefix suffix per-line?).
  
  The list argument can be used with the pprint-pop macro.

  The prefix is a string that is printed as the initial prefix of the logical
  block.  If per-line? is true, then the prefix is printed on every line.
  The suffix is a string that is printed at the end of the logical block.

  You can use this macro even when not pretty-printing, to get support
  for *print-length* and *print-level*.  In that case, you should have
  the body forms put out only a minimal amount of whitespace.

(pprint-pop)
  Returns the next item from the list specified to an enclosing 
  pprint-logical-block.  Checks for circular list tails and *print-length*
  abbreviation.

(pprint-exit-if-list-exhausted)
  Can be used inside pprint-logical-block to see if the list is empty.
  Causes the block to be exited if so.

(pprint-indent relative-to n . maybe-stream)
  Specify the indentation level to use for a logical block.
  The relative-to argument can be either BLOCK or CURRENT.

(pprint-tab kind colnum colinc . maybe-stream)
  Specify tabbing.  The kind argument can be one of LINE, SECTION,
  LINE-RELATIVE, or SECTION-RELATIVE.
  
(pprint-fill stream list . maybe-colon-atsign)
(pprint-linear stream list . maybe-colon-atsign)
(pprint-tabular stream list . maybe-colon-atsign-tabsize)
  Pretty-print list to the stream in the given style.
  

(format stream string-or-fn . args)
  The standard Common Lisp format, except that some of the more esoteric
  directives are unimplemented.  (Specifically, watch out for specifying
  field widths or using # or V parameters; most of the numeric formatting
  options are unimplemented, as are complicated directives like ~{...~}.)

  The stream parameter can be #f to output to a string, or #t to output
  to the (current-output-port).

  The string-or-fn argument can be a function as well as a string containing
  embedded directives.  The function is applied to the stream and the args.

(warning string-or-fn . args)
(error string-or-fn . args)



System Interface
----------------

(macroexpand-1 form . maybe-env)
(macroexpand form . maybe-env)
  As in Common Lisp.  Since we don't have lexical macros and don't allow
  syntax to be shadowed by local bindings, you can omit the environment 
  argument.  These functions are provided mostly for debugging purposes.

(eval form . maybe-compile)
  As in Common Lisp.  If the optional argument is supplied and is true,
  try to compile the code in memory, not interpret it.

(load filename)

*code-quality*
  A number between 0 and 3.  0 = minimal compilation, 1 = for debugging,
  2 = low safety, high speed, fast compilation, 3 = go all out.

(compile-file source-filename . maybe-binary-filename)

(with-compilation-unit options . forms)
  This is the ANSI CL macro.  We don't use any options.

(filename-place filename)
(filename-name filename)
(filename-type filename)
  We use a rather simplistic file system model.  Filenames are strings
  with place (or directory), name, and type components.  These functions
  pick apart filename strings.  You shouldn't have to mess with string 
  operations on the components directly.  

(assemble-filename place-filename name-filename type-filename)
  Build a new filename by combining the appropriate parts of the argument
  filenames.

source-file-type
binary-file-type
  These constants hold appropriate default types for source and
  compiled files.  By convention, source-file-type is ".scm" but
  the binary-file-type depends on the underlying Lisp system.

(file-exists? filename)
  Returns true if the file exists.

(file-write-date filename)
(current-date)
  Dates are represented as integers relative to an arbitrary base.  These
  functions are mostly useful for recording timestamps.

(get-run-time)
  Return run time as a floating-point number relative to an arbitrary base.
  Useful for doing timings.

(getenv name)
  Explicitly expand an environment variable.  (Environment variables that
  appear as filename prefixes are expanded automagically by the functions 
  that open files.)

(cd filename)
  Change the current directory.


(exit)
  Go away.


Reader Support
--------------

' => quote
` => backquote; also , and ,@
#t and #f


Random Stuff
------------

lisp-implementation-name
  returns a string identifying the underlying lisp implementation; e.g.
  "lucid", "t", etc.

(identify-system)
  return a longer string indentifying the lisp version and machine type.

left-to-right-evaluation
  True if the underlying Lisp always evaluates function arguments
  left-to-right; false otherwise.

(gc-messages onoff)
  Turn garbage collection messages on/off, if possible.

(identity x)
  The identity function.



Type specifiers
---------------

t
procedure
pair
null
list, (list element-type)
symbol
char
string
vector
number
integer
rational
float
fixnum, int
table, (table key-type value-type)
(enum . values)
(tuple . component-types)
bool
alist, (alist key-type value-type)
(maybe type)
struct
type-descriptor
slot-descriptor
  These are the standard type specifiers.

the
  As in Common Lisp.
subtype?
  Equivalent to CL subtypep
is-type?
  Equivalent to CL typep
typecase
  As in Common Lisp, also recognizes "else" clause.
  


Structures
----------

(struct? object)
  Returns true if the object is a struct.
(struct-type-descriptor object)
  Returns the type descriptor of a struct object.

name, slots, parent-type, printer
  Slots of type-descriptor object.

(td-name td)
(td-slots td)
(td-parent-type td)
(td-printer td)
  Accessors for type-descriptors.

name, type, default, getter
  Slots of slot-descriptor object.

(sd-name sd)
(sd-type sd)
(sd-default sd)
(sd-getter sd)
  Accessors for slot-descriptors.
(sd-getter-function sd)
  Returns a function which can be used to access a slot (as opposed to
  the symbol that names the function).

(lookup-type-descriptor type-name)
(lookup-slot-descriptor type-name slot-name)
  Name to descriptor mappings.


(make type . initializers)
  The type must name a struct type; it is not evaluated.
  The initializers are of the form (slot-name value-form).

(struct-slot type slot object)
  Generalized slot access.  Type and slot are symbols.  If both are
  quoted, can be used with SETF.

(with-slots type slot-names object . body)
  Binds the specified slots of object to local variables with the
  same names.  Bindings are read-only.  Type is not evaluated.

(update-slots type object . initializers)
  Modifies the slots of object.  Syntax of initializers is as for make.
  Type is not evaluated.

(define-struct name
  (include parent-type-name)
  (type-template subtype-of-type-descriptor)
  (prefix prefix-symbol)
  (predicate predicate-name)
  (slots
    (slot-name
      (type type)
      (default init-form)
      (bit #t)
      (read-only? #t)
      (uninitialized? #t))
    ...))

  Defines name as a subtype of struct with the given slots.
  All fields are optional.

  Include specifies the immediate supertype.  All accessors on the supertype
  work on the newly defined type.  It defaults to struct.

  Type-template specifies the metaclass.  It can be used to attach 
  additional information to the type descriptor.  It defaults to 
  type-descriptor.

  Prefix can be used to specify an alternate prefix for accessors.  The
  default is name-.

  Predicate can be used to create a predicate function.  The default is
  not to create one.

  If no default is specified for a slot, it's expected to have an
  explicit initializer supplied with MAKE.  You'll get a compilation
  warning otherwise, unless you specify the uninitialized? option instead.

  Bit is a hint for optimizing internal representation.

  Read-only? says not to create a SETFer for the slot.


(define-struct-printer struct-name printer-function)
  Specifies a printer function to use when *print-structure* is false.