@page @node Procedures and Macros @chapter Procedures and Macros @menu * Lambda:: Basic procedure creation using lambda. * Optional Arguments:: Handling keyword, optional and rest arguments. * Procedure Properties:: Procedure properties and metainformation. * Procedures with Setters:: Procedures with setters. * Macros:: Macros. @end menu @node Lambda @section Lambda: Basic Procedure Creation @node Optional Arguments @section Optional Arguments @node Procedure Properties @section Procedure Properties and Metainformation @c docstring begin (texi-doc-string "guile" "procedure-properties") @deffn primitive procedure-properties proc Return @var{obj}'s property list. @end deffn @c docstring begin (texi-doc-string "guile" "procedure-property") @deffn primitive procedure-property p k Return the property of @var{obj} with name @var{key}. @end deffn @c docstring begin (texi-doc-string "guile" "set-procedure-properties!") @deffn primitive set-procedure-properties! proc new_val Set @var{obj}'s property list to @var{alist}. @end deffn @c docstring begin (texi-doc-string "guile" "set-procedure-property!") @deffn primitive set-procedure-property! p k v In @var{obj}'s property list, set the property named @var{key} to @var{value}. @end deffn @c docstring begin (texi-doc-string "guile" "procedure-documentation") @deffn primitive procedure-documentation proc Return the documentation string associated with @code{proc}. By convention, if a procedure contains more than one expression and the first expression is a string constant, that string is assumed to contain documentation for that procedure. @end deffn @c docstring begin (texi-doc-string "guile" "closure?") @deffn primitive closure? obj Return @code{#t} if @var{obj} is a closure. @end deffn @r5index procedure? @c docstring begin (texi-doc-string "guile" "procedure?") @deffn primitive procedure? obj Return @code{#t} if @var{obj} is a procedure. @end deffn @c docstring begin (texi-doc-string "guile" "thunk?") @deffn primitive thunk? obj Return @code{#t} if @var{obj} is a thunk. @end deffn @c docstring begin (texi-doc-string "guile" "set-source-properties!") @deffn primitive set-source-properties! obj plist Install the association list @var{plist} as the source property list for @var{obj}. @end deffn @c docstring begin (texi-doc-string "guile" "set-source-property!") @deffn primitive set-source-property! obj key datum Set the source property of object @var{obj}, which is specified by @var{key} to @var{datum}. Normally, the key will be a symbol. @end deffn @c docstring begin (texi-doc-string "guile" "source-properties") @deffn primitive source-properties obj Return the source property association list of @var{obj}. @end deffn @c docstring begin (texi-doc-string "guile" "source-property") @deffn primitive source-property obj key Return the source property specified by @var{key} from @var{obj}'s source property list. @end deffn @node Procedures with Setters @section Procedures with Setters @c docstring begin (texi-doc-string "guile" "make-procedure-with-setter") @deffn primitive make-procedure-with-setter procedure setter Create a new procedure which behaves like @var{procedure}, but with the associated setter @var{setter}. @end deffn @c docstring begin (texi-doc-string "guile" "procedure-with-setter?") @deffn primitive procedure-with-setter? obj Return @code{#t} if @var{obj} is a procedure with an associated setter procedure. @end deffn @c docstring begin (texi-doc-string "guile" "procedure") @deffn primitive procedure proc Return the procedure of @var{proc}, which must be either a procedure with setter, or an operator struct. @end deffn @c docstring begin (texi-doc-string "guile" "setter") @deffn primitive setter proc @end deffn @node Macros @section Macros [FIXME: This needs some more text on the difference between procedures, macros and memoizing macros. Also, any definitions listed here should be double-checked by someone who knows what's going on. Ask Mikael, Jim or Aubrey for help. -twp] @c docstring begin (texi-doc-string "guile" "procedure->syntax") @deffn primitive procedure->syntax code Return a @dfn{macro} which, when a symbol defined to this value appears as the first symbol in an expression, returns the result of applying @var{code} to the expression and the environment. @end deffn @c docstring begin (texi-doc-string "guile" "procedure->macro") @deffn primitive procedure->macro code Return a @dfn{macro} which, when a symbol defined to this value appears as the first symbol in an expression, evaluates the result of applying @var{code} to the expression and the environment. The value returned from @var{code} which has been passed to @code{procedure->memoizing-macro} replaces the form passed to @var{code}. For example: @lisp (define trace (procedure->macro (lambda (x env) `(set! ,(cadr x) (tracef ,(cadr x) ',(cadr x)))))) (trace @i{foo}) @equiv{} (set! @i{foo} (tracef @i{foo} '@i{foo})). @end lisp @end deffn @c docstring begin (texi-doc-string "guile" "procedure->memoizing-macro") @deffn primitive procedure->memoizing-macro code Return a @dfn{macro} which, when a symbol defined to this value appears as the first symbol in an expression, evaluates the result of applying @var{proc} to the expression and the environment. The value returned from @var{proc} which has been passed to @code{procedure->memoizing-macro} replaces the form passed to @var{proc}. For example: @lisp (define trace (procedure->macro (lambda (x env) `(set! ,(cadr x) (tracef ,(cadr x) ',(cadr x)))))) (trace @i{foo}) @equiv{} (set! @i{foo} (tracef @i{foo} '@i{foo})). @end lisp @end deffn @c docstring begin (texi-doc-string "guile" "macro?") @deffn primitive macro? obj Return @code{#t} if @var{obj} is a regular macro, a memoizing macro or a syntax transformer. @end deffn @c docstring begin (texi-doc-string "guile" "macro-type") @deffn primitive macro-type m Return one of the symbols @code{syntax}, @code{macro} or @code{macro!}, depending on whether @var{m} is a syntax tranformer, a regular macro, or a memoizing macro, respectively. If @var{m} is not a macro, @code{#f} is returned. @end deffn @c docstring begin (texi-doc-string "guile" "macro-name") @deffn primitive macro-name m Return the name of the macro @var{m}. @end deffn @c docstring begin (texi-doc-string "guile" "macro-transformer") @deffn primitive macro-transformer m Return the transformer of the macro @var{m}. @end deffn @c docstring begin (texi-doc-string "guile" "cons-source") @deffn primitive cons-source xorig x y Create and return a new pair whose car and cdr are @var{x} and @var{y}. Any source properties associated with @var{xorig} are also associated with the new pair. @end deffn @c Local Variables: @c TeX-master: "guile.texi" @c End: