~ chicken-core (chicken-5) b5a1c5cf1625f768c67773aa32db529ac80df72f
commit b5a1c5cf1625f768c67773aa32db529ac80df72f Author: felix <felix@call-with-current-continuation.org> AuthorDate: Tue Mar 9 07:40:01 2010 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Mar 9 07:40:01 2010 +0100 merged with wiki manual diff --git a/manual/C interface b/manual/C interface index c94fbbe8..e2f1550f 100644 --- a/manual/C interface +++ b/manual/C interface @@ -91,10 +91,90 @@ These macros return immediate Scheme data objects. [C function] C_word C_list (C_word **ptr, int length, ...) +=== C_closure + + [C function] C_word C_closure (C_word **ptr, int length, C_word procedure, ...) + These functions allocate memory from {{ptr}} and initialize a fresh data object. The new data object is returned. {{ptr}} should be the '''address''' of an allocation pointer created with {{C_alloc}}. +To find out how big the memory block should be, use the {{C_SIZEOF_*}} +macros described below. + +Here's an example how to create a closure that accepts a vector, +stores the Scheme numbers 1, 2 and 3 and a given string in it and +returns that vector to its continuation: + +<enscript highlight=scheme> +#> + +#include <assert.h> + +void fill_vector(C_word c, C_word closure, C_word vec) +{ + C_word kontinuation = C_block_item(closure, 1); + + C_block_item(vec, 0) = C_fix(1); + C_block_item(vec, 1) = C_fix(2); + C_block_item(vec, 2) = C_fix(3); + C_block_item(vec, 3) = C_block_item(closure, 2); + + C_kontinue(kontinuation, vec); +} + +void one_two_three(C_word c, C_word self, C_word k, C_word str) +{ + /* + * Allocate room on the stack to hold the closure: 1 word for + * the type tag, 1 word for the procedure and 2 words for the + * values "closed over"; this procedure's continuation "k" and + * the argument "str". We could also use C_alloc(4). + */ + C_word closure[4], *cp = closure; + + /* Create the closure. It holds 3 values, not counting the tag */ + C_word closure_object = C_closure(&cp, 3, (C_word)fill_vector, k, str); + + /* + * After this, cp points just beyond the last word of the allocated + * data and closure_object is an opaque representation of the newly + * created closure as a whole, i.e. the following relations hold: + */ + assert( (closure + 4) == cp ); + assert( C_block_header(closure_object) == (*closure) ); + assert( C_data_pointer(closure_object) == (closure + 1) ); + assert( C_block_item(closure_object, 0) == (*(closure + 1)) ); + + /* Make a vector of 4 objects and use closure_object as continuation */ + C_allocate_vector(6, (C_word)NULL, closure_object, C_fix(4), + C_SCHEME_FALSE, /* not a byte vector */ + C_SCHEME_FALSE, /* initialization value. Don't care */ + C_SCHEME_FALSE); /* don't align at 8 bytes */ + /* .. C_allocate_vector does not return ... */ +} +<# + +(define one-two-three (##core#primitive "one_two_three")) + +(print (one-two-three "hi")) +</enscript> + +This is equivalent to the following in Scheme: + +<enscript highlight=scheme> +(define (one-two-three str) + (let ((fill-vector (lambda (vec) + (vector-set! vec 0 1) + (vector-set! vec 1 2) + (vector-set! vec 2 3) + (vector-set! vec 3 str) + vec))) + (fill-vector (make-vector 4 #f)))) + +(print (one-two-three "hi")) +</enscript> + === C_alloc @@ -185,7 +265,6 @@ back to C data. Note that {{C_c_string()}} returns a pointer to the character buffer of the actual Scheme object and is not zero-terminated. - === C_header_size [C macro] int C_header_size (C_word x) diff --git a/manual/Deviations from the standard b/manual/Deviations from the standard index b7a6bd2f..a36dd3e9 100644 --- a/manual/Deviations from the standard +++ b/manual/Deviations from the standard @@ -60,6 +60,8 @@ lambda-expressions. == Non-deviations that might surprise you +[4.3.1] {{let-syntax}} and {{letrec-syntax}} introduce a new scope. + [6.1] {{equal?}} compares all structured data recursively, while R5RS specifies that {{eqv?}} is used for data other than pairs, strings and vectors. However, R5RS does not dictate the treatment of data types diff --git a/manual/Extensions b/manual/Extensions index d0cb50d9..6c25f6c4 100644 --- a/manual/Extensions +++ b/manual/Extensions @@ -461,7 +461,7 @@ Available options: ; {{-s -sudo}} : use {{sudo(1)}} for installing or removing files ; {{-r -retrieve}} : only retrieve egg into current directory, don't install ; {{-n -no-install}} : do not install, just build (implies {{-keep}}) -; {{-p -prefix PREFIX}} : change installation prefix to {{PREFIX}}; note: this must be an absolute path +; {{-p -prefix PREFIX}} : change installation prefix to {{PREFIX}} ; {{-host}} : when cross-compiling, compile extension for host ; {{-test}} : run included test-cases, if available ; {{-username USER}} : set username for transports that require this diff --git a/manual/Getting started b/manual/Getting started index 63cad4a1..b359d2ef 100644 --- a/manual/Getting started +++ b/manual/Getting started @@ -196,7 +196,7 @@ other useful documents. The list of eggs is at A very useful search facility for questions about Chicken is found at [[http://www.callcc.org]]. The Chicken issue tracker is at -[[http://trac.callcc.org]]. +[[http://www.irp.oist.jp/trac/chicken/wiki]]. The Chicken community has two major mailing lists. If you are a Chicken user, {{Chicken-Users}} diff --git a/manual/The User's Manual b/manual/The User's Manual index c7e1a084..88bdc882 100644 --- a/manual/The User's Manual +++ b/manual/The User's Manual @@ -6,7 +6,7 @@ <img style="float:right; border-left:1px solid #ccc;border-bottom:1px solid #ccc;margin-left:1em;" src="http://www.call-with-current-continuation.org/chicken4.png" alt="Stylized picture of a chicken"/> </nowiki> -This is the manual for Chicken Scheme, version 4.3.7 +This is the manual for Chicken Scheme, version 4.4.0 ; [[Getting started]] : What is CHICKEN and how do I use it? diff --git a/manual/Unit files b/manual/Unit files index f0ff1c99..7d9e0985 100644 --- a/manual/Unit files +++ b/manual/Unit files @@ -27,8 +27,8 @@ For any component that is not contained in {{PATHNAME}}, {{#f}} is returned. ==== make-pathname ==== make-absolute-pathname -<procedure>(make-pathname DIRECTORY FILENAME [EXTENSION [SEPARATOR]])</procedure><br> -<procedure>(make-absolute-pathname DIRECTORY FILENAME [EXTENSION [SEPARATOR]])</procedure> +<procedure>(make-pathname DIRECTORY FILENAME [EXTENSION])</procedure><br> +<procedure>(make-absolute-pathname DIRECTORY FILENAME [EXTENSION])</procedure> Returns a string that names the file with the components {{DIRECTORY, FILENAME}} and (optionally) @@ -40,8 +40,6 @@ directory component), a string or a list of strings. {{FILENAME}} and {{EXTENSION}} should be strings or {{#f}}. {{make-absolute-pathname}} returns always an absolute pathname. -The {{[SEPARATOR]}} argument is deprecated. - ==== pathname-directory ==== pathname-file ==== pathname-extension diff --git a/manual/Unit library b/manual/Unit library index 8c707302..676e4aef 100644 --- a/manual/Unit library +++ b/manual/Unit library @@ -1224,7 +1224,7 @@ be compared using {{eq?}}. ==== get - <procedure>(get SYMBOL PROPERTY [DEFAULT])</procedure> +<procedure>(get SYMBOL PROPERTY [DEFAULT])</procedure> Returns the value stored under the key {{PROPERTY}} in the property list of {{SYMBOL}}. If no such property is stored, returns @@ -1232,29 +1232,29 @@ list of {{SYMBOL}}. If no such property is stored, returns ==== put! - <procedure>(put! SYMBOL PROPERTY VALUE)</procedure> - [setter] (set! (get SYMBOL PROPERTY) VALUE) +<procedure>(put! SYMBOL PROPERTY VALUE)</procedure> +setter: (set! (get SYMBOL PROPERTY) VALUE) Stores {{VALUE}} under the key {{PROPERTY}} in the property list of {{SYMBOL}} replacing any previously stored value. ==== remprop! - <procedure>(remprop! SYMBOL PROPERTY)</procedure> +<procedure>(remprop! SYMBOL PROPERTY)</procedure> Deletes the first property matching the key {{PROPERTY}} in the property list of {{SYMBOL}}. Returns {{#t}} when a deletion performed, and {{#f}} otherwise. ==== symbol-plist - <procedure>(symbol-plist SYMBOL)</procedure> - [setter] (set! (symbol-plist SYMBOL) LST) +<procedure>(symbol-plist SYMBOL)</procedure> +setter: (set! (symbol-plist SYMBOL) LST) Returns the property list of {{SYMBOL}} or sets it. ==== get-properties - <procedure>(get-properties SYMBOL PROPERTIES)</procedure> +<procedure>(get-properties SYMBOL PROPERTIES)</procedure> Searches the property list of {{SYMBOL}} for the first property with a key in the list {{PROPERTIES}}. Returns 3 values: the matching property key, value, diff --git a/manual/Using the interpreter b/manual/Using the interpreter index 10e558ad..c1804906 100644 --- a/manual/Using the interpreter +++ b/manual/Using the interpreter @@ -79,7 +79,7 @@ The easiest way is to use the {{-script}} option like this: read))) % chmod +x foo - % foo "(+ 3 4)" + % ./foo "(+ 3 4)" 7 The parameter {{command-line-arguments}} is set to a list of theTrap