5. Bigloo
A ``practical Scheme compiler''
User manual for version 2.8c
September 2006 -- Standard Library
This chapter presents the Bigloo standard library. Bigloo is mostly R5RS compliant but it proposes many extensions to this standard. In a first section (Scheme Library) the Bigloo R5RS support is presented. This section also contains various function that are not standard (for instance, various functions used to manage a file system). Then, in the following sections (Serialization, Bit Manipulation, and System Programming Bigloo specific extensions are presented. Bigloo input and output facilities constitue a large superset of the standard Scheme definition. For this reason they are presented in a separate section (Input and Output).

5.1 Scheme Library

When the definition of a procedure or a special form is the same in Bigloo and Scheme, we just mention its name; otherwise, we explain it and qualify it as a ``bigloo procedure''.

5.1.1 Booleans

The standard boolean objects are #t and #f. Note: the empty list is true.

not objlibrary procedure
not returns #t if obj is false, and returns #f otherwise.

(not #t)                               => #f
(not 3)                                => #f
(not (list 3))                         => #f
(not #f)                               => #t
(not '())                              => #f
(not (list))                           => #f
(not 'nil)                             => #f

boolean? objlibrary procedure
Boolean? returns #t if obj is either #t or #f and returns #f otherwise.

(boolean? #f)                          => #t
(boolean? 0)                           => #f
(boolean? '())                         => #f

5.1.2 Equivalence predicates

eqv? obj1 obj2procedure
eq? obj1 obj2procedure
eqv? and eq? are equivalent in Bigloo.

(eq? 'a 'a)                            =>  #t
(eq? '(a) '(a))                        =>  unspecified
(eq? (list 'a) (list 'a))              =>  #f
(eq? "a" "a")                          =>  unspecified
(eq? "" "")                            =>  unspecified
(eq? '() '())                          =>  #t
(eq? 2 2)                              =>  unspecified
(eq? #\A #\A)                          =>  unspecified
(eq? car car)                          =>  #t
(let ((n (+ 2 3)))
  (eq? n n))                           =>  unspecified
(let ((x '(a)))
  (eq? x x))                           =>  #t
(let ((x '#()))
  (eq? x x))                           =>  #t
(let ((p (lambda (x) x)))
  (eq? p p))                           =>  #t
Since Bigloo implements eqv? as eq?, the behavior is not always conforming to R5RS.
(eqv? 'a 'a)                           =>  #t
(eqv? 'a 'b)                           =>  #f
(eqv? 2 2)                             =>  #t
(eqv? '() '())                         =>  #t
(eqv? 100000000 100000000)             =>  #t
(eqv? (cons 1 2) (cons 1 2))           =>  #f
(eqv? (lambda () 1)
      (lambda () 2))                   =>  #f
(eqv? #f 'nil)                         =>  #f
(let ((p (lambda (x) x)))
  (eqv? p p))                          =>  unspecified


The following examples illustrate cases in which the above rules do not fully specify the behavior of eqv?. All that can be said about such cases is that the value returned by eqv? must be a boolean.

(eqv? "" "")                           =>  unspecified
(eqv? '#() '#())                       =>  unspecified
(eqv? (lambda (x) x)
      (lambda (x) x))                  =>  unspecified
(eqv? (lambda (x) x)
      (lambda (y) y))                  =>  unspecified

(define gen-counter (lambda () (let ((n 0)) (lambda () (set! n (+ n 1)) n)))) (let ((g (gen-counter))) (eqv? g g)) => #t (eqv? (gen-counter) (gen-counter)) => #f (define gen-loser (lambda () (let ((n 0)) (lambda () (set! n (+ n 1)) 27)))) (let ((g (gen-loser))) (eqv? g g)) => #t (eqv? (gen-loser) (gen-loser)) => unspecified

(letrec ((f (lambda () (if (eqv? f g) 'both 'f))) (g (lambda () (if (eqv? f g) 'both 'g)))) (eqv? f g)) => unspecified

(letrec ((f (lambda () (if (eqv? f g) 'f 'both))) (g (lambda () (if (eqv? f g) 'g 'both)))) (eqv? f g)) => #f (eqv? '(a) '(a)) => unspecified (eqv? "a" "a") => unspecified (eqv? '(b) (cdr '(a b))) => unspecified (let ((x '(a))) (eqv? x x)) => #t

equal? obj1 obj2library procedure
(equal? 'a 'a)                         =>  #t
(equal? '(a) '(a))                     =>  #t
(equal? '(a (b) c)
        '(a (b) c))                    =>  #t
(equal? "abc" "abc")                   =>  #t
(equal? 2 2)                           =>  #t
(equal? (make-vector 5 'a)
        (make-vector 5 'a))            =>  #t
(equal? (lambda (x) x)
        (lambda (y) y))                =>  unspecified

See r5rs, Equivalence predicates, for more details.

5.1.3 Pairs and lists

The form () is illegal.

pair? objprocedure

cons a dprocedure

pair-or-null? objbigloo procedure
Returns #t if obj is either a pair or the empty list. Otherwise it returns #f.

car pairprocedure
cdr pairprocedure
set-car! pair objprocedure
set-cdr! pair objprocedure

caar pairlibrary procedure
cadr pairlibrary procedure
...

cdddar pairlibrary procedure
cddddr pairlibrary procedure

null? objlibrary procedure
list? objlibrary procedure
list obj ...library procedure
length listlibrary procedure
append list ...library procedure
append! list ...bigloo procedure
A destructive append.

reverse listlibrary procedure
reverse! listbigloo procedure
A destructive reverse.

list-ref list klibrary procedure
take list klibrary procedure
drop list klibrary procedure
list-tail list klibrary procedure
list-ref returns the k element of the list.

take returns a new list made of the first k element of the list.

Drop and list-tail returns the sublist of list obtained by omitting the first k elements.

last-pair listbigloo procedure
Returns the last pair in the nonempty, possibly improper, list.

memq obj listlibrary procedure
memv obj listlibrary procedure
member obj listlibrary procedure
assq obj alistlibrary procedure
assv obj alistlibrary procedure
assoc obj alistlibrary procedure
remq obj listbigloo procedure
Returns a new list which is a copy of list with all items eq? to obj removed from it.

remq! obj listbigloo procedure
Same as remq but in a destructive way.

delete obj listbigloo procedure
Returns a new list which is a copy of list with all items equal? to obj deleted from it.

delete! obj listbigloo procedure
Same as delete but in a destructive way.

cons* obj ...bigloo procedure
Returns an object formed by consing all arguments together from right to left. If only one obj is supplied, that obj is returned.

every? pred clist1 clist2 ...bigloo procedure
Applies the predicate across the lists, returning true if the predicate returns true on every application.

(every < '(1 2 3) '(2 3 4))            => #t
(every < '(1 2 3) '(2 3 0))            => #f

any? pred clist1 clist2 ...bigloo procedure
Applies the predicate across the lists, returning true if the predicate returns true for at least one application.

(any < '(1 2 3) '(2 3 4))            => #t
(any < '(1 2 3) '(2 3 0))            => #t

every fun clist1 clist2 ...bigloo procedure
Applies the function fun across the lists, returning the last non-false if the function returns non-false on every application. If non-false, the result of every is the last value returned by the last application of fun.

(every < '(1 2 3) '(2 3 4))            => #t
(every < '(1 2 3) '(2 3 0))            => #f

any fun clist1 clist2 ...bigloo procedure
Applies the function fun across the lists, returning non-false if the function returns non-false for at least one application. If non-false, the result of any is the first non-false value returned by fun.

(any < '(1 2 3) '(2 3 4))            => #t
(any < '(1 2 3) '(2 3 0))            => #t

make-list n [fill]bigloo procedure
Returns an n-element list, whose elements are all the value fill. If the fill argument is not given, the elements of the list may be arbitrary values.

(make-list 4 'c)                     => (c c c c)

list-tabulate n init-procbigloo procedure
Returns an n-element list. Element i of the list, where 0 <= i < n, is produced by (init-proc i). No guarantee is made about the dynamic order in which init-proc is applied to these indices.

(list-tabulate 4 values)             => (0 1 2 3)

list-split list n [filler]bigloo procedure
list-split list n [filler]bigloo procedure
Split a list into a list of lists of length n. Last smaller list is filled with filler.

(list-split '(1 2 3 4 5 6 7 8) 3 0) => ((1 2 3) (4 5 6) (7 8 0))



list-split list int [filler]bigloo procedure
list-split! list int [filler]bigloo procedure
Split a list into chunk (lists) of size int. The elements are missing and a filler is provided, it is used for filling the last list.

(list-split (iota 10) 3)     => ((0 1 2) (3 4 5) (6 7 8) (9))
(list-split (iota 10 3) '-1) => ((0 1 2) (3 4 5) (6 7 8) (9 -1 -1))

iota count [start step]bigloo procedure
Returns a list containing the elements

(start start+step ... start+(count-1)*step)
The start and step parameters default to 0 and 1, respectively. This procedure takes its name from the APL primitive.

(iota 5) => (0 1 2 3 4)
(iota 5 0 -0.1) => (0 -0.1 -0.2 -0.3 -0.4)

See r5rs, Pairs and lists, for more details.

5.1.4 Symbols

Symbols are case sensitive and the reader is case sensitive too. So:
(eq? 'foo 'FOO) => #f
(eq? (string->symbol "foo") (string->symbol "FOO")) => #f
Symbols may contain special characters (such as #\Newline or #\Space). Such symbols that have to be read must be written: |[^]+|. The function write uses that notation when it encounters symbols containing special characters.

(write 'foo) => foo
(write 'Foo) =>Foo
(write '|foo bar|) => |foo bar|
symbol? objprocedure
symbol->string symbolprocedure
Returns the name of the symbol as a string. Modifying the string result of symbol->string could yield incoherent programs. It is better to copy the string before any physical update. For instance, don't write:
(string-downcase! (symbol->string 'foo))
See r5rs, Symbols, for more details.

but prefer:
(string-downcase (symbol->string 'foo))

string->symbol stringprocedure
string->symbol-ci stringbigloo procedure
symbol-append symbol ...bigloo procedure
String->symbol returns a symbol whose name is string. String->symbol respects the case of string. String->symbol-ci returns a symbol whose name is (string-upcase string). Symbol-append returns a symbol whose name is the concatenation of all the symbol's names.

gensym [obj]bigloo procedure
Returns a new fresh symbol. If obj is provided and is a string or a symbol, it is used as prefix for the new symbol.

symbol-plist symbol-or-keywordbigloo procedure
Returns the property-list associated with symbol-or-keyword.

getprop symbol-or-keyword keybigloo procedure
Returns the value that has the key eq? to key from the symbol-or-keyword's property list. If there is no value associated with key then #f is returned.

putprop! symbol-or-keyword key valbigloo procedure
Stores val using key on symbol-or-keyword's property list.

remprop! symbol-or-keyword keybigloo procedure
Removes the value associated with key in the symbol-or-keyword's property list. The result is unspecified.

Here is an example of properties handling:

(getprop 'a-sym 'a-key)       => #f
(putprop! 'a-sym 'a-key 24)  
(getprop 'a-sym 'a-key)       => 24
(putprop! 'a-sym 'a-key2 25)  
(getprop 'a-sym 'a-key)       => 24
(getprop 'a-sym 'a-key2)      => 25
(symbol-plist 'a-sym)         => (a-key2 25 a-key 24)
(remprop! 'a-sym 'a-key)
(symbol-plist 'a-sym)         => (a-key2 25)
(putprop! 'a-sym 'a-key2 16)  
(symbol-plist 'a-sym)         => (a-key2 16)

5.1.5 Keywords

Keywords constitute an extension to Scheme required by Dsssl [Dsssl96]. Keywords syntax is either <ident>: or :<ident>.

Keywords are autoquote and case sensitive. So
(eq? toto: TOTO:) => #f
The colon character (:) does not belong to they keyword. Hence
(eq? toto: :toto) => #t
keyword? objbigloo procedure
keyword->string keywordbigloo procedure
string->keyword stringbigloo procedure
keyword->symbol keywordbigloo procedure
symbol->keyword symbolbigloo procedure

5.1.6 Numbers

Bigloo has only three kinds of numbers: fixnum, long fixnum and flonum. Operations on complexes and rationals are not implemented but for compatibility purposes, the functions complex? and rational? exist. (In fact, complex? is the same as number? and rational? is the same as real? in Bigloo.) The accepted prefixes are #b, #o, #d, #x, #e, #ex, #l, and #lx. For each generic arithmetic procedure, Bigloo provides two specialized procedures, one for fixnums and one for flonums. The names of these two specialized procedures is the name of the original one suffixed by fx or fl. A fixnum has the size of a C integer minus 2 bits. A flonum has the size of a C double.

number? objprocedure
real? objprocedure
integer? objprocedure
complex? xbigloo procedure
rational? xbigloo procedure

fixnum? objbigloo procedure
flonum? objbigloo procedure
These two procedures are type checkers on types integer and real.

elong? objbigloo procedure
llong? objbigloo procedure
The elong? procedures is a type checker for "hardware" integers, that is integers that have the very same size has the host platform permits (e.g., 32 bits or 64 bits integers). The llong? procedure is a type checker for "hardware" long long integers. Exact integers literal are introduced with the special #e and #ex prefixes. Exact long integers literal are introduced with the special #l and #lx prefixes.

make-elong intbigloo procedure
make-llong intbigloo procedure
Create an exact fixnum integer from the fixnum value int.



exact? zprocedure
inexact? zprocedure

zero? zlibrary procedure
positive? zlibrary procedure
negative? zlibrary procedure
odd? nlibrary procedure
even? nlibrary procedure

max x1 x2 ...library procedure
min x1 x2 ...library procedure

= z1 z2 z3 ...procedure
=fx i1 i2bigloo procedure
=fl r1 r2bigloo procedure
=elong r1 r2bigloo procedure
=llong r1 r2bigloo procedure
< z1 z2 z3 ...procedure
<fx i1 i2bigloo procedure
<fl r1 r2bigloo procedure
<elong r1 r2bigloo procedure
<lllong r1 r2bigloo procedure
> z1 z2 z3 ...procedure
>fx i1 i2bigloo procedure
>fl r1 r2bigloo procedure
>elong r1 r2bigloo procedure
>lllong r1 r2bigloo procedure
<= z1 z2 z3 ...procedure
<=fx i1 i2bigloo procedure
<=fl r1 r2bigloo procedure
<=elong r1 r2bigloo procedure
<=lllong r1 r2bigloo procedure
>= z1 z2 z3 ...procedure
>=fx i1 i2bigloo procedure
>=fl r1 r2bigloo procedure
>=elong r1 r2bigloo procedure
>=llong r1 r2bigloo procedure

+ z ...procedure
+fx i1 i2bigloo procedure
+fl r1 r2bigloo procedure
+elong r1 r2bigloo procedure
+llong r1 r2bigloo procedure
* z ...procedure
*fx i1 i2bigloo procedure
*fl r1 r2bigloo procedure
*elong r1 r2bigloo procedure
*lllnog r1 r2bigloo procedure
- zprocedure
- z1 z2 ...procedure
-fx i1 i2bigloo procedure
-fl r1 r2bigloo procedure
-elong r1 r2bigloo procedure
-llong r1 r2bigloo procedure
negfx ibigloo procedure
negfl rbigloo procedure
negelong rbigloo procedure
negllong rbigloo procedure
These two functions implement the unary function -.

/ z1 z2procedure
/ z1 z2 ...procedure
/fx i1 i2bigloo procedure
/fl r1 r2bigloo procedure
/elong r1 r2bigloo procedure
/lllong r1 r2bigloo procedure

abs zlibrary procedure
quotient z1 z2procedure
quotientelong z1 z2procedure
quotientllong z1 z2procedure
remainder z1 z2procedure
remainderelong z1 z2procedure
remainderllong z1 z2procedure
modulo z1 z2procedure
gcd z ...procedure
lcm z ...procedure
floor zprocedure
ceiling zprocedure
truncate zprocedure
round zprocedure

random zbigloo procedure
seed-random! zbigloo procedure
the random function returns a pseudo-random integer between 0 and z.

If no seed value is provided, the random function is automatically seeded with a value of 1.

exp zprocedure
log zprocedure
sin zprocedure
cos zprocedure
tan zprocedure
asin zprocedure
acos zprocedure
atan z1 z2procedure
sqrt zprocedure
expt z1 x2procedure

exact->inexact zprocedure
inexact->exact zprocedure
number->string zprocedure
integer->string ibigloo procedure
integer->string i radixbigloo procedure
elong->string ibigloo procedure
elong->string i radixbigloo procedure
llong->string ibigloo procedure
llong->string i radixbigloo procedure
real->string zbigloo procedure

string->number string procedure
string->number string radixprocedure
string->elong string radixprocedure
string->llong string radixprocedure
Bigloo implements a restricted version of string->number. If string denotes a floating point number then, the only radix 10 may be send to string->number. That is:

(string->number "1243" 16)          => 4675
(string->number "1243.0" 16)        -|
# *** ERROR:bigloo:string->number
# Only radix `10' is legal for floating point number -- 16
(string->elong "234456353")         => #e234456353
In addition, string->number does not support radix encoded inside string. That is:

(string->number "#x1243")          => #f

string->integer stringbigloo procedure
string->integer string radixbigloo procedure
string->real stringbigloo procedure
fixnum->flonum ibigloo procedure
flonum->fixnum rbigloo procedure
elong->fixnum ibigloo procedure
fixnum->elong rbigloo procedure
llong->fixnum ibigloo procedure
fixnum->llong rbigloo procedure
elong->flonum ibigloo procedure
flonum->elong rbigloo procedure
llong->flonum ibigloo procedure
flonum->llong rbigloo procedure
For efficiency, string->real and string->integer do not test whether the string can be read as a number. Therefore the result might be wrong if the string cannot be read as a number.

These last procedures implement the natural translation from and to fixnum, flonum, elong, and llong.


See r5rs, Numerical operations, for more details.

5.1.7 Characters

Bigloo knows one more named characters #\tab, #\return, and #\null in addition to the #\space and #\newline of R5RS.

A new alternate syntax exists for characters: #a<ascii-code> where <ascii-code> is the three digit decimal ascii number of the character to be read. Thus, for instance, the character #\space can be written #a032.

char? objprocedure

char=? char1 char2procedure
char<? char1 char2procedure
char>? char1 char2procedure
char<=? char1 char2procedure
char>=? char1 char2procedure
char-ci=? char1 char2library procedure
char-ci<? char1 char2library procedure
char-ci>? char1 char2library procedure
char-ci<=? char1 char2library procedure
char-ci>=? char1 char2library procedure

char-alphabetic? charlibrary procedure
char-numeric? charlibrary procedure
char-whitespace? charlibrary procedure
char-upper-case? charlibrary procedure
char-lower-case? charlibrary procedure

char->integer charprocedure
integer->char iprocedure

char-upcase charlibrary procedure
char-downcase charlibrary procedure

5.1.8 UCS-2 Characters

UCS-2 Characters are two byte encoded characters. They can be read with the syntax: #u<unicode> where <unicode> is the four digit hexadecimal unicode value of the character to be read. Thus, for instance, the character #\space can be written #u0020.

ucs2? objbigloo procedure

ucs2=? ucs2a ucs2bbigloo procedure
ucs2<? ucs2a ucs2bbigloo procedure
ucs2>? ucs2a ucs2bbigloo procedure
ucs2<=? ucs2a ucs2bbigloo procedure
ucs2>=? ucs2a ucs2bbigloo procedure
ucs2-ci=? ucs2a ucs2bbigloo procedure
ucs2-ci<? ucs2a ucs2bbigloo procedure
ucs2-ci>? ucs2a ucs2bbigloo procedure
ucs2-ci<=? ucs2a ucs2bbigloo procedure
ucs2-ci>=? ucs2a ucs2bbigloo procedure

ucs2-alphabetic? ucs2bigloo procedure
ucs2-numeric? ucs2bigloo procedure
ucs2-whitespace? ucs2bigloo procedure
ucs2-upper-case? ucs2bigloo procedure
ucs2-lower-case? ucs2bigloo procedure

ucs2->integer ucs2bigloo procedure
integer->ucs2 ibigloo procedure

ucs2->char ucs2bigloo procedure
char->ucs2 charbigloo procedure

ucs2-upcase ucs2bigloo procedure
ucs2-downcase ucs2bigloo procedure

5.1.9 Strings

There are three different syntaxes for strings in Bigloo: traditional, foreign or Unicode. The traditional syntax for strings may conform to the Revised Report, see r5rs, Lexical structure. With the foreign syntax, C escape sequences are interpreted as specified by ISO-C. In addition, Bigloo's reader evaluate \x?? sequence as an hexadecimal escape character. For Unicode syntax, see Unicode (UCS-2) Strings. Only the reader distinguishes between these three appearances of strings; i.e., there is only one type of string at evaluation-time. The regular expression describing the syntax for foreign string is: #"([^"]|\")*". Escape characters are controlled by the parameter bigloo-strict-r5rs-strings (see Parameters).

The library functions for string processing are:
string? objprocedure

string-null? sSRFI-13 procedure
Is s an empty string?

make-string kprocedure
make-string k charprocedure
string char ...library procedure

string-length stringprocedure
string-ref string kprocedure
string-set! string k charprocedure

string=? string1 string2library procedure
This function returns #t if the string1 and string2 are made of the same characters. It returns #f otherwise.

substring=? string1 string2 lenbigloo procedure
This function returns #t if string1 and string2 have a common prefix of size len.

(substring=? "abcdef" "ab9989898" 2)
   => #t
(substring=? "abcdef" "ab9989898" 3)
   => #f

substring-at? string1 string2 offset [len]bigloo procedure
substring-ci-at? string1 string2 offset [len]bigloo procedure
This function returns #t if string2 is at position offset in the string string1. It returns #f otherwise.
(substring-at? "abcdefghij" "def" 3)
   => #t
(substring-at? "abcdefghij" "def" 2)
   => #f
(substring-at? "abcdefghij" "defz" 3)
   => #f
(substring-at? "abcdefghij" "defz" 3 3)
   => #t

string-ci=? string1 string2library procedure
substring-ci=? string1 string2 lenbigloo procedure
substring-ci-at? string1 string2 posbigloo procedure
string<? string1 string2library procedure
string>? string1 string2library procedure
string<=? string1 string2library procedure
string>=? string1 string2library procedure
string-ci<? string1 string2library procedure
string-ci>? string1 string2library procedure
string-ci<=? string1 string2library procedure
string-ci>=? string1 string2library procedure

string-index string charsetbigloo procedure
Returns the first occurrence of a character of char-or-set in string. The argument charset is either a character or a string. If no character is found, string-index returns -1.

string-contains string1 string2bigloo procedure
string-contains-ci string1 string2bigloo procedure
Does string s1 contain string s2?

Return the index in string1 where string2 occurs first as a substring, or false.

string-contains-ci is the case-insensitive variant. Case-insensitive comparison is done by case-folding characters with the operation:

(char-downcase (char-upcase c))

string-compare3 string1 string2bigloo procedure
string-compare3-ci string1 string2bigloo procedure
This function compares string1 and string2. It returns a negative integer if string1 < string2. It returns zero if the string1 equal string2. It returns a positive integer if string1 > string2.

substring string start endlibrary procedure
string must be a string, and start and end must be exact integers satisfying:

  0 <= START <= END <= (string-length STRING)
substring returns a newly allocated string formed from the characters of STRING beginning with index START (inclusive) and ending with index END (exclusive).

(substring "abcdef" 0 5)
   => "abcde"
(substring "abcdef" 1 5)
   => "bcde"

string-shrink! string endlibrary procedure
string must be a string, and end must be an exact integers satisfying:

  0 <= END <= (string-length STRING)
string-shrink! returns a newly allocated string formed from the characters of STRING beginning with index 0 (inclusive) and ending with index END (exclusive). As much as possible string-shrink! changes the argument string. That is, as much as possible, and for the back-ends that enable it, string-shrink! operate a side effect on its argument.

(let ((s (string #\a #\b #\c #\d #\e)))
   (set! s (string-shrink! s 3))
   s)
   => "abc"

string-append string ...library procedure
string->list stringlibrary procedure
list->string listlibrary procedure
string-copy stringlibrary procedure

string-fill! string charbigloo procedure
Stores char in every element of the given string and returns an unspecified value.

string-downcase stringbigloo procedure
Returns a newly allocated version of string where each upper case letter is replaced by its lower case equivalent.

string-upcase stringbigloo procedure
Returns a newly allocated version of string where each lower case letter is replaced by its upper case equivalent.

string-capitalize stringbigloo procedure
Builds a newly allocated capitalized string.

string-downcase! stringbigloo procedure
Physically downcases the string argument.

string-upcase! stringbigloo procedure
Physically upcases the string argument.

string-capitalize! stringbigloo procedure
Physically capitalized the string argument.

string-for-read stringbigloo procedure
Returns a copy of string with each special character replaced by an escape sequence.

blit-string! string1 o1 string2 o2 lenbigloo procedure
Fill string s2 starting at position o2 with len characters taken out of string s1 from position o1.

(let ((s (make-string 20 #\-)))
	(blit-string! "toto" 0 s 16 4)
	s)
   => "----------------toto"

string-replace string char1 char2bigloo procedure
string-replace! string char1 char2bigloo procedure
Replace all the occurrence of char1 by char2 in string. The function string-replace returns a newly allocated string. The function string-replace! modifies its first argument.

string-split stringbigloo procedure
string-split string delimitersbigloo procedure
Parses string and returns a list of tokens ended by a character of the delimiters string. If delimiters is omitted, it defaults to a string containing a space, a tabulation and a newline characters.

(string-split "/usr/local/bin" "/") => ("usr" "local" "bin")
(string-split "once   upon a time") => ("once" "upon" "a" "time")

base64-encode stringbigloo procedure
base64-decode stringbigloo procedure
Encodes (respec. decodes) a string into a base64 representation.

md5sum stringbigloo procedure
Computes MD5 message digest.

5.1.10 Unicode (UCS-2) Strings

UCS-2 strings cannot be read by the standard reader but UTF-8 strings can. The special syntax for UTF-8 is described by the regular expression: #u"([^]|\")*".

The library functions for Unicode string processing are:
ucs2-string? objbigloo procedure

make-ucs2-string kbigloo procedure
make-ucs2-string k charbigloo procedure
ucs2-string k ...bigloo procedure

ucs2-string-length s-ucs2bigloo procedure
ucs2-string-ref s-ucs2 kbigloo procedure
ucs2-string-set! s-ucs2 k charbigloo procedure

ucs2-string=? s-ucs2a s-ucs2bbigloo procedure
ucs2-string-ci=? s-ucs2a s-ucs2bbigloo procedure
ucs2-string<? s-ucs2a s-ucs2bbigloo procedure
ucs2-string>? s-ucs2a s-ucs2bbigloo procedure
ucs2-string<=? s-ucs2a s-ucs2bbigloo procedure
ucs2-string>=? s-ucs2a s-ucs2bbigloo procedure
ucs2-string-ci<? s-ucs2a s-ucs2bbigloo procedure
ucs2-string-ci>? s-ucs2a s-ucs2bbigloo procedure
ucs2-string-ci<=? s-ucs2a s-ucs2bbigloo procedure
ucs2-string-ci>=? s-ucs2a s-ucs2bbigloo procedure

subucs2-string s-ucs2 start endbigloo procedure
ucs2-string-append s-ucs2 ...bigloo procedure
ucs2-string->list s-ucs2bigloo procedure
list->ucs2-string charsbigloo procedure
ucs2-string-copy s-ucs2bigloo procedure

ucs2-string-fill! s-ucs2 charbigloo procedure
Stores char in every element of the given s-ucs2 and returns an unspecified value.

ucs2-string-downcase s-ucs2bigloo procedure
Builds a newly allocated ucs2-string with lower case letters.

ucs2-string-upcase s-ucs2bigloo procedure
Builds a new allocated ucs2-string with upper case letters.

ucs2-string-downcase! s-ucs2bigloo procedure
Physically downcases the s-ucs2 argument.

ucs2-string-upcase! s-ucs2bigloo procedure
Physically upcases the s-ucs2 argument.

ucs2-string->utf8-string s-ucs2bigloo procedure
utf8-string->ucs2-string stringbigloo procedure
Convert UCS-2 strings to (or from) UTF-8 encoded ascii strings.

iso-latin->utf8-string stringbigloo procedure
iso-latin->utf8-string! stringbigloo procedure
utf8->iso-latin stringbigloo procedure
utf8->iso-latin! stringbigloo procedure
Encode and decode iso-latin strings into utf8. The functions iso-latin->utf8-string! and utf8->iso-latin! may return, as result, the string they receive as argument.

5.1.11 Vectors

Vectors are not autoquoted objects.

vector? objprocedure

make-vector kprocedure
make-vector k objprocedure
vector obj ...library procedure

vector-length vectorprocedure
vector-ref vector kprocedure
vector-set! vector k objprocedure

vector->list vectorlibrary procedure
list->vector listlibrary procedure

vector-fill! vector objlibrary procedure
Stores obj in every element of vector. For instance:

(let ((v (make-vector 5 #f)))
   (vector-fill! v #t)
   v)

copy-vector vector lenbigloo procedure
Allocate a new vector of size len and fills it with the first len element of vector. The new length len may be bigger than the old vector length.

vector-copy vector start endbigloo procedure
vector must be a vector, and start and end must be exact integers satisfying:

  0 <= START <= END <= (vector-length VECTOR)
vector-copy returns a newly allocated vector formed from the elements of VECTOR beginning with index START (inclusive) and ending with index END (exclusive).

(vector-copy '#(1 2 3 4) 0 4)
   => '#(1 2 3 4)
(vector-copy '#(1 2 3 4) 1 3)
   => '#(2 3)

See r5rs, Vectors, for more details.

5.1.12 Control features

procedure? objprocedure

apply proc arg1 ... argsprocedure

map proc list1 list2 ...library procedure
map! proc list1 list2 ...bigloo procedure
for-each proc list1 list2 ...library procedure

filter pred list ...library procedure
filter! pred list ...library procedure
Strip out all elements of list for which the predicate pred is not true. The second version filter! is destructive:

(filter number? '(1 2 #\a "foo" foo 3)) => (1 2 3)
(let ((l (list 1 2 #\a "foo" 'foo 3)))
   (set! l (filter! number? l))
   l)                                   => (1 2 3)

append-map proc list1 list2 ...library procedure
append-map! proc list1 list2 ...library procedure
The expression
  (append-map f clist1 clist2 ...)
is equivalent to:

  (apply append (map f clist1 clist2 ...))
The expression
  (append-map! f clist1 clist2 ...)
is equivalent to:

  (apply append! (map f clist1 clist2 ...))

filter-map pred list ...bigloo procedure
As map but only none #f values are accumulated in the resulting list. The Bigloo implementation complies with the SRFI-1 description.

(filter-map (lambda (x) (if (number? x) '- #f)) '(1 2 #\a "foo" foo 3)) => (- - -)

sort obj procbigloo procedure
Sorts obj according to proc test. The argument obj can either be a vector or a list. In either case, a copy of the argument is returned. For instance:

(let ((l '(("foo" 5) ("bar" 6) ("hux" 1) ("gee" 4))))
   (sort l (lambda (x y) (string<? (car x) (car y)))))
   => ((bar 6) (foo 5) (gee 4) (hux 1))

force promiselibrary procedure

call/cc procbigloo procedure
This function is the same as the call-with-current-continuation function of the R5RS, see r5rs, call-with-current-continuation, but it is necessary to compile the module with the -call/cc option to use it, see Section See The Bigloo command line.

Note: Since call/cc is difficult to compile efficiently, one might consider using bind-exit instead. For this reason, we decided to enable call/cc only with a compiler option.

bind-exit escape bodybigloo syntax
This form provides an escape operator facility. bind-exit evaluates the body, which may refer to the variable escape which will denote an ``escape function'' of one argument: when called, this escape function will return from the bind-exit form with the given argument as the value of the bind-exit form. The escape can only be used while in the dynamic extent of the form. Bindings introduced by bind-exit are immutable.

(bind-exit (exit)
 (for-each (lambda (x)
             (if (negative? x)
                 (exit x)))
           '(54 0 37 -3 245 19))
 #t)                                  => -3

(define list-length (lambda (obj) (bind-exit (return) (letrec ((r (lambda (obj) (cond ((null? obj) 0) ((pair? obj) (+ (r (cdr obj)) 1)) (else (return #f)))))) (r obj)))))

(list-length '(1 2 3 4)) => 4 (list-length '(a b . c)) => #f

unwind-protect expr protectbigloo syntax
This form provides protections. Expression expr is evaluated. If this evaluation requires the invocation of an escape procedure (a procedure bounded by the bind-exit special form), protect is evaluated before the control jump to the exit procedure. If expr does not raise any exit procedure, unwind-protect has the same behaviour as the begin special form except that the value of the form is always the value of expr.

(define (my-open f)
   (if (file-exists? f)
       (let ((port (open-input-file f)))
          (if (input-port? port)
              (unwind-protect
                 (bar port)
                 (close-input-port port))))))

dynamic-wind before thunk afterprocedure
Calls thunk without arguments, returning the result(s) of this call. Before and after are called, also without arguments, as required by the following rules (note that in the absence of calls to continuations captured using call/cc the three arguments are called once each, in order). Before is called whenever execution enters the dynamic extent of the call to thunk and after is called whenever it exits that dynamic extent. The dynamic extent of a procedure call is the period between when the call is initiated and when it returns. In Scheme, because of call/cc, the dynamic extent of a call may not be a single, connected time period. It is defined as follows:

  • The dynamic extent is entered when execution of the body of the called procedure begins.

  • The dynamic extent is also entered when execution is not within the dynamic extent and a continuation is invoked that was captured (using call/cc) during the dynamic extent.

  • It is exited when the called procedure returns.

  • It is also exited when execution is within the dynamic extent and a continuation is invoked that was captured while not within the dynamic extent.

If a second call to dynamic-wind occurs within the dynamic extent of the call to thunk and then a continuation is invoked in such a way that the afters from these two invocations of dynamic-wind are both to be called, then the after associated with the second (inner) call to dynamic-wind is called first.

If a second call to dynamic-wind occurs within the dynamic extent of the call to thunk and then a continuation is invoked in such a way that the befores from these two invocations of dynamic-wind are both to be called, then the before associated with the first (outer) call to dynamic-wind is called first.

If invoking a continuation requires calling the before from one call to dynamic-wind and the after from another, then the after is called first.

The effect of using a captured continuation to enter or exit the dynamic extent of a call to before or after is undefined.


(let ((path '())
      (c #f))
  (let ((add (lambda (s)
               (set! path (cons s path)))))
    (dynamic-wind
      (lambda () (add 'connect))
      (lambda ()
        (add (call/cc
               (lambda (c0)
                 (set! c c0)
                 'talk1))))
      (lambda () (add 'disconnect)))
    (if (< (length path) 4)
        (c 'talk2)
        (reverse path))))
    
   => (connect talk1 disconnect connect talk2 disconnect)

unspecifiedbigloo procedure
Returns the unspecified (noted as #unspecified) object with no specific property.

try exp handlerbigloo syntax
This form is documented in Section Errors and Assertions.

values obj ...procedure
Delivers all of its arguments to its continuation. Except for continuations created by the call-with-values procedure, all continuations take exactly one value. Values might be defined as follows:

(define (values . things)
  (call/cc
    (lambda (cont) (apply cont things))))

call-with-values producer consumerprocedure
Calls its producer argument with no values and a continuation that, when passed some values, calls the consumer procedure with those values as arguments. The continuation for the call to consumer is the continuation of the call to call-with-values.

(call-with-values (lambda () (values 4 5))
                  (lambda (a b) b))
    => 5
(call-with-values * -)
    => -1

multiple-value-bind (var ...) producer exp ...bigloo syntax
receive (var ...) producer exp ...bigloo syntax
Evaluates exp ... in a environment where var ... are bound from the evaluation of producer. The result of producer must be a call to values where the number of argument is the number of bound variables.
(define (bar a)
   (values (modulo a 5) (quotient a 5)))

(define (foo a) (multiple-value-bind (x y) (bar a) (print x " " y)))

(foo 354) -| 4 70


5.2 Input and output

This section describes Scheme operation for reading and writing data. The section Files describes functions for handling files.

5.2.1 Library functions

call-with-input-file string proclibrary procedure
call-with-output-file string proclibrary procedure
These two procedures call proc with one argument, a port obtained by opening string. See r5rs, Ports, for more details.

(call-with-input-file "/etc/passwd"
   (lambda (port)
      (let loop ((line (read-line port)))
         (if (not (eof-object? line))
             (begin
                (print line)
                (loop (read-line port)))))))

input-port? obj procedure
input-string-port? obj procedure
output-port? objprocedure
output-string-port? objprocedure
port? objprocedure

input-port-name objbigloo procedure
Returns the file name for which obj has been opened.

input-port-timeout-set! port timebigloo (>=2.8b) procedure
output-port-timeout-set! port timebigloo (>=2.8b) procedure
These two functions limit the time an read or write operation may last. If the time limit (expressed in microseconds) exceeded, an exception of time &io-timeout-error is raised.

input-port-close-hook portbigloo procedure
input-port-close-hook-set! port procbigloo procedure
Returns (resp. sets) the close hook of the input port. The close hook is a nullary procedure.

Example:
(let ((p (open-input-string "/etc/passwd")))
  (input-port-close-hook-set! p (lambda () (display 'done)))
  ...
  (close-input-port p))

input-port-reopen! objbigloo procedure
Re-open the input port obj. That is, re-start reading from the first character of the input port.

current-input-portprocedure
current-output-portprocedure
current-error-portbigloo procedure

with-input-from-file string thunkoptional procedure
with-input-from-string string thunkoptional procedure
with-input-from-procedure procedure thunkoptional procedure
with-output-to-file string thunkoptional procedure
with-error-to-file string thunkbigloo procedure
with-output-to-string thunkbigloo procedure
with-error-to-string thunkbigloo procedure
A port is opened from file string. This port is made the current input port (resp. the current output port or the current error port) and thunk is called. See r5rs, Ports, for more details.

(with-input-from-file "/etc/passwd"
   (lambda ()
      (let loop ((line (read-line (current-input-port))))
         (if (not (eof-object? line))
             (begin
                (print line)
                (loop (read-line (current-input-port))))))))

with-input-from-port port thunkbigloo procedure
with-output-to-port port thunkbigloo procedure
with-error-to-port port thunkbigloo procedure
with-input-from-port, with-output-to-port and with-error-to-port all suppose port to be a legal port. They call thunk making port the current input (resp. output or error) port. None of these functions close port on the continuation of thunk.

(with-output-to-port (current-error-port) 
   (lambda () (display "hello")))

open-input-file file-nameprocedure
If file-name is a regular file name, open-input-file behaves as the function defined in the Scheme report. If file-name starts with special prefixes it behaves differently. Here are the recognized prefixes:

  • | (a string made of the characters #\| and #\space) Instead of opening a regular file, Bigloo opens an input pipe. The same syntax is used for output file.

    (define pin (open-input-file "| cat /etc/passwd"))
    (define pout (open-output-file "| wc -l"))

    (display (read pin) pout) (close-input-port pin) (newline pout) (close-output-port pout)
  • pipe: Same as | .

  • file: Opens a regular file.

  • gzip: Opens a port on a gzipped filed. This is equivalent to open-input-gzip-file. Example:

    (with-input-from-file "gzip:bigloo.tar.gz"
       (lambda ()
          (send-chars (current-input-port) (current-output-port))))
    
  • string: Opens a port on a string. This is equivalent to open-input-string. Example:

    (with-input-from-file "string:foo bar Gee"
       (lambda ()
          (print (read))
          (print (read))
          (print (read))))
       -| foo
       -| bar
       -| Gee
    
  • http:server/path Opens an http connection on server and open an input file on file path.

  • http:server:port-number/path Opens an http connection on server, on port number port and open an input file on file path.

  • ftp:server/path Opens an http connection on server and open an input file on file path.

  • ressource: Opens a JVM ressource file. Opening a ressource: file in non JVM backend always return #f. On the JVM backend it returns a input port if the ressource exists. Otherwise, it returns #f.


open-input-gzip-file file-namebigloo procedure
open-input-gzip-port input-portbigloo procedure
Open respectively a gzipped file for input and a port on a gzipped stream. Note that closing a gzip port opened from a port pi does not close the pi port.

(let ((p (open-input-gzip-file "bigloo.tar.gz")))
   (unwind-protect
      (read-line p1)
      (close-input-port p)))
(let* ((p1 (open-input-file "bigloo.tar.gz"))
       (p2 (open-input-gzip-port p1)))
   (unwind-protect
      (read-line p2)
      (close-input-port p2)
      (close-input-port p1)))

open-input-string stringbigloo procedure
Returns an input-port able to deliver characters from string.

open-input-c-string stringbigloo procedure
Returns an input-port able to deliver characters from C string. The buffer used by the input port is the exact same string as the argument. That is, no buffer is allocated.

open-input-procedure procedurebigloo procedure
Returns an input-port able to deliver characters from procedure. Each time a character has to be read, the procedure is called. This procedure may returns a string of characters, or the boolean #f. This last value stands for the end of file.

Example:

(let ((p (open-input-procedure (let ((s #t))
				  (lambda ()
				     (if s
					 (begin 
                                            (set! s #f)
                                            "foobar")
					 s))))))
   (read))

open-output-file file-nameprocedure
The same syntax as open-input-file for file names applies here. When a file name starts with | , Bigloo opens an output pipe instead of a regular file.

append-output-file file-namebigloo procedure
If file-name exists, this function returns an output-port on it, without removing it. New output will be appended to file-name. If file-name does not exist, it is created.

open-output-stringbigloo procedure
This function returns an output string port. This object has almost the same purpose as output-port. It can be used with all the printer functions which accept output-port. An output on a output string port memorizes all the characters written. An invocation of flush-output-port or close-output-port on an output string port returns a new string which contains all the characters accumulated in the port.

get-output-string output-portbigloo procedure
Given an output port created by open-output-string, returns a string consisting of the characters that have been output to the port so far.

close-input-port input-portprocedure
close-output-port output-portprocedure
According to R5RS, the value returned is unspecified. However, if output-port was created using open-output-string, the value returned is the string consisting of all characters sent to the port.

input-port-name input-portbigloo procedure
Returns the name of the file used to open the input-port.

input-port-position portbigloo procedure
output-port-position portbigloo procedure
Returns the current position (a character number), in the port.

set-input-port-position! port posbigloo procedure
set-output-port-position! port posbigloo procedure
These functions set the file position indicator for port. The new position, measured in bytes, is specified by pos. It is an error to seek a port that cannot be changed (for instance, a string or a console port). The result of these functions is unspecified. An error is raised if the position cannot be changed.

input-port-reopen! input-portbigloo procedure
This function re-opens the input input-port. That is, it reset the position in the input-port to the first character.

read [input-port]procedure
read/case case [input-port]bigloo procedure
read-case-sensitive [input-port]bigloo procedure
read-case-insensitive [input-port]bigloo procedure
Read a lisp expression. The case sensitivity of read is unspecified. If have to to enforce a special behavior regarding the case, use read/case, read-case-sensitive or read-case-insensitive. Let us consider the following source code: The value of the read/case's case argument may either be upcase, downcase or sensitive. Using any other value is an error.

(define (main argv)
   (let loop ((exp (read-case-sensitive)))
      (if (not (eof-object? exp))
          (begin
             (display "exp: ")
             (write exp)
             (display " [")
             (display exp)
             (display "]")
             (print " eq?: " (eq? exp 'FOO) " " (eq? exp 'foo))
             (loop (read-case-sensitive))))))
Thus:
> a.out
foo
  -| exp: foo [foo] eq?: #f #t
FOO
  -| exp: FOO [FOO] eq?: #t #f

read/rp grammar portbigloo procedure
read/lalrp lalrg rg port [emptyp]bigloo procedure
These functions are fully explained in Regular Parsing, and Lalr Parsing.

read-char [port]procedure
read-byte [port]procedure
peek-char [port]procedure
peek-byte [port]procedure
eof-object? objprocedure

char-ready? [port]procedure
As specified in the R5Rs, r5rs, Ports, char-ready? returns #t if a character is ready on the input port and returns #f otherwise. If char-ready returns #t then the next read-char operation on the given port is guaranteed not to hang. If the port is at end of file then char-ready? returns #t. Port may be omitted, in which case it defaults to the value returned by current-input-port.

When using char-ready? consider the latency that may exists before characters are available. For instance, executing the following source code:

(let* ((proc (run-process "/bin/ls" "-l" "/bin" output: pipe:))
       (port (process-output-port proc)))
   (let loop ((line (read-line port)))
      (print "char ready " (char-ready? port))
      (if (eof-object? line)
          (close-input-port port)
          (begin
             (print line)
             (loop (read-line port))))))
Produces outputs such as:
char ready #f
total 7168
char ready #f
-rwxr-xr-x    1 root     root         2896 Sep  6  2001 arch
char ready #f
-rwxr-xr-x    1 root     root        66428 Aug 25  2001 ash
char ready #t
...
For a discussion of Bigloo processes, see Process.

Note: Thanks to Todd Dukes for the example and the suggestion of including it this documentation.

read-line [input-port]bigloo procedure
Reads characters from input-port until a #\Newline, a #\Return or an end of file condition is encountered. read-line returns a newly allocated string composed of the characters read.

read-lines [input-port]bigloo procedure
Accumulates all the line of an input-port into a list.

read-of-strings [input-port]bigloo procedure
Reads a sequence of non-space characters on input-port, makes a string of them and returns the string.

read-string [input-port]bigloo procedure
Reads all the characters of input-port into a string.

read-chars size [input-port]bigloo procedure
read-chars! buf size [input-port]bigloo procedure
The function read-chars returns a newly allocated strings made of size characters read from input-port (or from (current-input-port) if input-port is not provided). If less than size characters are available on the input port, the returned string is smaller than size. Its size is the number of available characters.

The function read-char! fills the buffer buf with at most size characters.

port->string-list input-portbigloo procedure
Returns a list of strings composed of the elements of input-port.

port->list input-port readerbigloo procedure
port->sexp-list input-portbigloo procedure
Port->list applies reader to port repeatedly until it returns EOF, then returns a list of results. Port->list-sexp is equivalent to (port->list read port).

send-chars input-port output-port [len] [offset]bigloo procedure
Transfer the characters from input-port to output-port. This procedure is sometimes mapped to a system call (such as sendfile under Linux) and might thus be more efficient than copying the ports by hand. The optional argument offset specifies an offset from which characters of input-port are sent. The function send-chars returns the number of characters sent.

read-fill-string! s o len [input-port]bigloo procedure
Fills the string s starting at offset o with at most len characters read from the input port input-port (or from (current-input-port) if input-port is not provided). This function returns the number of fill characters (which may be smaller than len if less characters are available).

Example:
(let ((s (make-string 10 #\-)))
   (with-input-from-string "abcdefghijlkmnops"
      (lambda ()
         (read-fill-string! s 3 5)
         s)))
   => ---abcde--

write obj [output-port]library procedure
display obj [output-port]library procedure
print obj ...bigloo procedure
This procedure allows several objects to be displayed. When all these objects have been printed, print adds a newline.

display* obj ...bigloo procedure
This function is similar to print but does not add a newline.

fprint output-port obj ...bigloo procedure
This function is the same as print except that a port is provided.

newline [output-port]procedure
write-char char [output-port]procedure
flush-output-port output-portbigloo procedure
This procedure flushes the output port output-port.

format format-string [objs]bigloo procedure
Note: Many thanks to Scott G. Miller who is the author of SRFI-28. Most of the documentation of this function is copied from the SRFI documentation.

Accepts a message template (a Scheme String), and processes it, replacing any escape sequences in order with one or more characters, the characters themselves dependent on the semantics of the escape sequence encountered.

An escape sequence is a two character sequence in the string where the first character is a tilde ~. Each escape code's meaning is as follows:

  • ~a The corresponding value is inserted into the string as if printed with display.
  • ~s The corresponding value is inserted into the string as if printed with write.
  • ~% A newline is inserted.
  • ~~ A tilde ~ is inserted.
~a and ~s, when encountered, require a corresponding Scheme value to be present after the format string. The values provided as operands are used by the escape sequences in order. It is an error if fewer values are provided than escape sequences that require them.

~% and ~~ require no corresponding value.

(format "Hello, ~a" "World!") 
   -| Hello, World!
(format "Error, list is too short: ~s~%" '(one "two" 3)) 
   -| Error, list is too short: (one "two" 3)

printf format-string [objs]bigloo procedure
fprintf port format-string [objs]bigloo procedure
Formats objs to the current output port or to the specified port.

pp obj [output-port]bigloo procedure
Pretty print obj on output-port.

*pp-case*bigloo variable
Sets the variable to respect, lower or upper to change the case for pretty-printing.

*pp-width*bigloo variable
The width of the pretty-print.

write-circle obj [output-port]bigloo procedure
Display recursive object obj on output-port. Each component of the object is displayed using the write library function.

display-circle obj [output-port]bigloo procedure
Display recursive object obj on output-port. Each component of the object is displayed using the display library function.

For instance:
(define l (list 1 2 3))
(set-car! (cdr l) l)
(set-car! (cddr l) l)
(display-circle l)  -| #0=(1 #0# #0#)

display-string string output-portbigloo procedure
display-substring string start end output-portbigloo procedure
String must be a string, and start and end must be exact integers satisfying 0 <= start <= end <= (string-length string).

Display-substring displays a string formed from the characters of string beginning with index start (inclusive) and ending with index end (exclusive).

5.2.2 mmap

The mmap function asks to map a file into memory. This memory area can be randomly accessed as a string. In general using mmap improves performance in comparison with equivalent code using regular ports.

mmap? obj bigloo procedure
Returns #t if and only if obj has been produced by open-mmap. Otherwise, it returns #f.

open-mmap path [mode]bigloo procedure
Maps a file path into memory. The optional argument mode specifies how the file is open. The argument can be:

  • read: #t The memory can be read
  • read: #f The memory cannot be read
  • write: #t The memory can be written
  • write: #f The memory is read-only.

close-mmap mmbigloo procedure
Closes the memory mapped. Returns #t on success, #f otherwise.

mmap-length mmbigloo procedure
Returns the length, an exact integer, of the memory mapped.

mmap-read-position mmbigloo procedure
mmap-read-position-set! mm offsetbigloo procedure
mmap-write-position mmbigloo procedure
mmap-write-position-set! mm offsetbigloo procedure
Returns and sets the read and write position of a memory mapped memory. The result and the argument are exact integers.

mmap-ref mm offsetbigloo procedure
Reads the character in mm at offset, an exact long (::elong). This function sets the read position to offset + 1.

mmap-set! mm offset charbigloo procedure
Writes the character char in mm at offset, an exact long (::elong). This function sets the write position to offset + 1.

mmap-substring mm start endbigloo procedure
Returns a newly allocated string made of the characters read from mm starting at position start and ending at position end - 1. If the values start and end are not ranged in [0...(mmap-length mm)], an error is signaled. The function mmap-substring sets the read position to end.

mmap-substring-set! mm start strbigloo procedure
Writes the string str to mm at position start. If the values start and start + (string-length str) are not ranged in [0...(mmap-length mm)[, an error is signaled. The function mmap-substring sets the write position to start + (string-length str).

mmap-get-char mmbigloo procedure
mmap-put-char! mm cbigloo procedure
mmap-get-string mm lenbigloo procedure
mmap-put-string! mm strbigloo procedure
These functions get (resp. put) character and strings into a memory mapped area. They increment the read (resp. write) position. An error is signaled if the characters read (resp. writen) outbound the length of the memory mapped.

5.2.3 Gzip

port->gzip-port input-port bufsizbigloo procedure
This function takes a regular port as input (input-port). It constructs a new ports that automatically unzip the read characters.

open-input-gzip-file path [bufsiz]bigloo procedure
This function opens a gzipped file for input. The file is automatically unzipped when the characters are read. It is equivalent to:

(let ((p (open-input-port path)))
  (port->gzip-port p))
Gzipped files can also be using the gzip: prefix. That is:

(open-input-gzip-file "a-path.gz")


is equivalent to:

(open-input-file "gzip:a-path.gz")

gunzip-sendchars input-port output-portbigloo procedure
Transmit all the characters from the gzipped input-port to the output-port.

Note that the function send-chars can also be used on gzipped input-ports.

gunzip-parse-header input-portbigloo procedure
Parse the header of input-port. Returns #f if and only if the port is not gzipped.

5.2.4 Tar

tar-read-header [input-port]bigloo procedure
Reads a tar header from input-port. If the input-port does not conform the tar format, an IO exception is raised. On success a tar-header descriptor is returned.

tar-read-block tar-header [input-port]bigloo procedure
Reads the content of the tar-header block.

tar-round-up-to-record-size intbigloo procedure
Rounds up tar-block sizes.

tar-header-name tar-headerbigloo procedure
tar-header-mode tar-headerbigloo procedure
tar-header-uid tar-headerbigloo procedure
tar-header-gid tar-headerbigloo procedure
tar-header-size tar-headerbigloo procedure
tar-header-mtim tar-headerbigloo procedure
tar-header-checksum tar-headerbigloo procedure
tar-header-type tar-headerbigloo procedure
tar-header-linkname tar-headerbigloo procedure
tar-header-uname tar-headerbigloo procedure
tar-header-gname tar-headerbigloo procedure
tar-header-devmajor tar-headerbigloo procedure
tar-header-devminir tar-headerbigloo procedure
Return various information about tar-header.

The following example simulates the Unix command tar xvfz:

(define (untar path)
   (let ((pz (open-input-gzip-port path)))
      (unwind-protect
	 (let loop ((lst '()))
	    (let ((h (tar-read-header pz)))
	       (if (not h)
		   lst
		   (case (tar-header-type h)
		      ((dir)
		       (let ((path (make-file-name base (tar-header-name h))))
			  (rm-rf path)
			  (if (make-directory path)
			      (loop lst)
			      (error 'untar
				     "Cannot create directory"
				     path))))
		      ((normal)
		       (let* ((path (make-file-name base (tar-header-name h)))
			      (dir (dirname path)))
			  (when (and (file-exists? dir) (not (directory? dir)))
			     (delete-file dir))
			  (unless (file-exists? dir)
			     (make-directory dir))
			  (with-output-to-file path
			     (lambda ()
				(display (tar-read-block h pz))))
			  (loop (cons path lst))))
		      (else
		       (error 'untar
			      (format "Illegal file type `~a'"
				      (tar-header-type h))
			      (tar-header-name h)))))))
	 (close-input-port pz))))

5.3 Serialization

string->obj stringbigloo procedure
This function converts a string which has been produced by obj->string into a Bigloo object.

obj->string objectbigloo procedure
This function converts into a string any Bigloo object which does not contain a procedure.

The implementation of the last two functions ensures that for every Bigloo object obj (containing no procedure), the expression:

(equal? obj (string->obj (obj->string obj)))
   => #t
binary-port? objbigloo procedure
open-output-binary-file file-namebigloo procedure
append-output-binary-file file-namebigloo procedure
open-input-binary-file file-namebigloo procedure
close-binary-port binary-portbigloo procedure
input-obj binary-portbigloo procedure
output-obj binary-port objbigloo procedure
Bigloo allows Scheme objects to be dumped into, and restored from, files. These operations are performed by the previous functions. The dump and the restore use the two functions obj->string and string->obj.

It is also possible to use a binary file as a flat character file. This can be done by the means of output-char, input-char, output-string, and input-string functions.

input-char binary-portbigloo procedure
output-char binary-portbigloo procedure
The function input-char reads a single character from a binary-port. It returns the read character or the end-of-file object. The function output-char writes a character into a binary-port.

input-string binary-port lenbigloo procedure
output-string binary-portbigloo procedure
The function input-string reads a string from a binary-port of maximum length len. It returns a newly allocated string whose length is possibly smaller than len. The function output-string writes a string into a binary-port.

input-fill-string! binary-port string lenbigloo procedure
Fills a string with characters read from binary-port with at most len characters. The function returns the number of filled characters.

register-procedure-serialization serializer unserializerbigloo procedure
There is no existing portable method to dump and restore a procedure. Thus, if obj->string is passed a procedure, it will emit an error message. Sometime, using strict restrictions, it may be convenient to use an ad-hoc framework to serialize and unserialize procedures. User may specify there own procedure serializer and unserializer. This is the role of register-procedure-serialization. The argument serializer is a procedure of one argument, converting a procedure into a characters strings. The argument unserializer is a procedure of one argument, converting a characters string into a procedure. It belongs to the user to provide correct serializer and unserializer.

Here is an example of procedure serializer and unserializer that may be correct under some Unix platform:

(module foo
   (extern (macro %sprintf::int (::string ::string ::procedure) "sprintf")))

(define (string->procedure str) (pragma "(obj_t)(strtoul(BSTRING_TO_STRING($1), 0, 16))" str))

(define (procedure->string proc) (let ((item (make-string 10))) (%sprintf item "#p%lx" proc) item))

(register-procedure-serialization procedure->string string->procedure)

(let ((x 4)) (let ((obj (cons "toto" (lambda (y) (+ x y))))) (let ((nobj (string->obj (obj->string obj)))) (print ((cdr nobj) 5)))))

get-procedure-serialization bigloo procedure
Returns the a pair whose car is the current procedure serializer and the cdr is the current procedure unserializer.

register-process-serialization serializer unserializerbigloo procedure
Same as register-procedure-serialization for Bigloo processes.

get-process-serialization bigloo procedure
Same as get-procedure-serialization for Bigloo processes.


5.4 Bit manipulation

These procedures allow the manipulation of fixnums as bit-fields.
bit-or i1 i2bigloo procedure
bit-orelong i1 i2bigloo procedure
bit-orllong i1 i2bigloo procedure
bit-xor i1 i2bigloo procedure
bit-xorelong i1 i2bigloo procedure
bit-xorllong i1 i2bigloo procedure
bit-and i1 i2bigloo procedure
bit-andelong i1 i2bigloo procedure
bit-andllong i1 i2bigloo procedure
bit-not ibigloo procedure
bit-notelong ibigloo procedure
bit-notllong ibigloo procedure
bit-lsh i1 i2bigloo procedure
bit-lshelong i1 i2bigloo procedure
bit-lshllong i1 i2bigloo procedure
bit-rsh i1 i2bigloo procedure
bit-ursh i1 i2bigloo procedure
bit-rshelong i1 i2bigloo procedure
bit-rshllong i1 i2bigloo procedure
(bit-or 5 3)                           => 7
(bit-orelong #e5 #e3)                  => #e7
(bit-xor 5 3)                          => 6
(bit-andllong #l5 #l3)                 => #l1
(bit-not 5)                            => -6
(bit-lsh 5 3)                          => 40
(bit-rsh 5 1)                          => 2


5.5 Hash Tables

Bigloo offers hash tables. Here are described functions which define and use them.

make-hashtable [bucket-len] [max-bucket-len] [eq-test] [hashn]bigloo procedure
Defines an hash table for which the number of buckets is bucket-len. The variable max-bucket-len specify when the table should be resized. If provided, these two values have to be exact integers greater or equal to 1. Normally you could ignore bucket-len and max-bucket-len arguments and call make-hashtable with no argument at all. The argument eqtest enables the specification of a comparison function. The first argument of this function is the keys contained in the table. The second argument is the searched key. By default hash tables rely on equal?. The argument hashn specifies an hashing function. It defaults to get-hashnumber. Each optional arguments bucket-len, max-bucket-len, eq-test, and hashn can be bound to the Bigloo value #unspecified which forces its default.

hashtable? objbigloo procedure
Returns #t if obj is an hash table, constructed by make-hashtable.

hashtable-size tablebigloo procedure
Returns the number of entries contained in table.

hashtable-contains? table keybigloo procedure
Returns the boolean #t if it exists at least one entry whose key is key in table. If not entry is found #f is returned.

hashtable-get table keybigloo procedure
Returns the entry whose key is key in table. If not entry is found #f is returned.

hashtable-put! table key objbigloo procedure
Puts obj in table under the key key. This function returns the object bound in the table. If there was an object obj-old already in the table with the same key as obj, this function returns obj-old; otherwise it returns obj.

hashtable-remove! table keybigloo procedure
Removes the object associated to key from table, returning #t if such object was bound in table and #f otherwise.

hashtable-update! table key update-fun init-valuebigloo procedure
If key is already in table, the new value is calculated by (update-fun current-value). Otherwise the table is extended by an entry linking key and init-value.

hashtable->vector tablebigloo procedure
hashtable->list tablebigloo procedure
Convert a hash table table to a vector or to a list.

hashtable-key-list tablebigloo procedure
Returns the list of keys used in the table.

hashtable-map table funbigloo procedure
Returns a list whose elements are the result of applying fun to each of the keys and elements of table (no order is specified). In consequence, fun must be a procedure of two arguments. The first one is a key and the second one, an associated object.

hashtable-for-each table funbigloo procedure
Applies fun to each of the keys and elements of table (no order is specified). In consequence, fun must be a procedure of two arguments. The first one is a key and the second one, an associated object.

hashtable-filter! table funbigloo procedure
Filter out elements from table according to predicate fun.

Here is an example of hash table.

(define *table* (make-hashtable))

(hashtable-put! *table* "toto" "tutu") (hashtable-put! *table* "tata" "titi") (hashtable-put! *table* "titi" 5) (hashtable-put! *table* "tutu" 'tutu) (hashtable-put! *table* 'foo 'foo)

(print (hashtable-get *table* "toto")) -| "tutu" (print (hashtable-get *table* 'foo)) -| 'foo (print (hashtable-get *table* 'bar)) -| #f

(hashtable-for-each *table* (lambda (key obj) (print (cons key obj)))) -| ("toto" . "tutu") ("tata" . "titi") ("titi" . 5) ("tutu" . TUTU) (foo . foo)
object-hashnumber objectbigloo generic
This generic function computes a hash number of the instance object.

Example:
(define-method (object-hashnumber pt::point)
   (with-access::point pt (x y)
      (+fx (*fx x 10) y)))




5.6 System programming

5.6.1 Operating System interface

register-exit-function! procbigloo procedure
Register proc as an exit functions. Proc is a procedure accepting of one argument. This argument is the numerical value which is the status of the exit call. The registered functions are called when the execution ends.

exit intbigloo procedure
Apply all the registered exit functions then stops an execution, returning the integer int.

signal n procbigloo procedure
Provides a signal handler for the operating system dependent signal n. proc is a procedure of one argument.

get-signal-handler nbigloo procedure
Returns the current handler associated with signal n or #f if no handler is installed.

system . stringsbigloo procedure
Append all the arguments strings and invoke the native host system command on that new string which returns an integer.

system->string . stringsbigloo procedure
Append all the arguments strings and invoke the native host system command on that new string. If the command completes, system->string returns a string made of the output of the command.

getenv stringbigloo procedure
Returns the string value of the Unix shell's string variable. If no such variable is bound, getenv returns #f.

putenv string valbigloo procedure
Adds or modifies the global environment variable string so that it is bound to val after the call. This facility is not supported by all back-end. In particular, the JVM back-end does not support it.

datebigloo procedure
Returns the current date in a string. See also Date.

sleep microsbigloo procedure
Sleeps for a delay during at least micros microseconds.

command-linebigloo procedure
Returns a list of strings which are the Unix command line arguments.

executable-namebigloo procedure
Returns the name of the running executable.

os-classbigloo procedure
Gives the OS class (e.g. unix).

os-namebigloo procedure
Gives the OS name (e.g. Linux).

os-archbigloo procedure
Gives the host architecture (e.g. i386).

os-versionbigloo procedure
Gives the operating system version (e.g. RedHat 2.0.27).

os-tmpbigloo procedure
Gives the regular temporary directory (e.g. /tmp).

file-separatorbigloo procedure
Gives the operating system file separator (e.g. #\/).

path-separatorbigloo procedure
Gives the operating system file path separator (e.g.#\:).

For additional functions (such as directory->list) see Input and Output.

unix-path->listbigloo procedure
Converts a Unix path to a Bigloo list of strings.

(unix-path->list ".")           => (".")
(unix-path->list ".:/usr/bin")  => ("." "/usr/bin")

hostnamebigloo procedure
Returns the fully qualified name of the current host.

5.6.2 Files

See Input and Output for file and directory handling. This section only deals with name handling. Four procedures exist to manipulate Unix filenames.

basename stringbigloo procedure
Returns a copy of string where the longest prefix ending in / is deleted if any existed.

prefix stringbigloo procedure
Returns a copy of string where the suffix starting by the char #\. is deleted. If no prefix is found, the result of prefix is a copy of string. For instance:

(prefix "foo.scm") 
   => "foo"
(prefix "./foo.scm") 
   => "./foo"
(prefix "foo.tar.gz") 
   => "foo.tar"

suffix stringbigloo procedure
Returns a new string which is the suffix of string. If no suffix is found, this function returns an empty string. For instance,

(suffix "foo.scm") 
   => "scm"
(suffix "./foo.scm") 
   => "scm"
(suffix "foo.tar.gz") 
   => "gz"

dirname stringbigloo procedure
Returns a new string which is the directory component of string. For instance:

(dirname "abc/def/ghi") 
   => "abc/def"
(dirname "abc") 
   =>  "."
(dirname "abc/") 
   => "abc"
(dirname "/abc") 
   => "/"

pwdbigloo procedure
Returns the current working directory.

chdir dir-namebigloo procedure
Changes the current directory to dir-name. On success, chdir returns #t. On failure it returns #f.

make-file-name dir-name namebigloo procedure
Make an absolute file-name from a directory name dir-name and a relative name name.

make-file-path dir-name name . namesbigloo procedure
Make an absolute file-name from a directory name dir-name and a relative name names.

file-name->list namebigloo procedure
Explodes a file name into a list.

(file-name->list "/etc/passwd")
   => '("" "etc" "passwd")
(file-name->list "etc/passwd")
   => '("etc" "passwd")

file-name-canonicalize namebigloo procedure
file-name-canonicalize! namebigloo procedure
file-name-unix-canonicalize namebigloo procedure
file-name-unix-canonicalize! namebigloo procedure
Canonicalizes a file name. If the file name is malformed this function raises an &io-malformed-url-error exception.

In addition to handling .. directory name, the function file-name-unix-canonicalize also handles the ~ character.

(file-name-canonicalize "/etc/passwd")
   => "/etc/passwd"
(file-name-canonicalize "/etc/../tmp/passwd")
   => "/tmp/passwd"
(file-name-canonicalize "~/passwd")
   => "~/passwd"
(file-name-unix-canonicalize "~/passwd")
   => "/home/a-user/passwd"
(file-name-unix-canonicalize "~foo/passwd")
   => "/home/foo/passwd"



find-file/path name pathbigloo procedure
Search, in sequence, in the directory list path for the file name. If name is an absolute name, then path is not used to find the file. If name is a relative name, the function make-file-name is used to build absolute name from name and the directories in path. The current path is not included automatically in the list of path. In consequence, to check the current directory one may add "." to the path list. On success, the absolute file name is returned. On failure, #f is returned. Example:

(find-file/path "/etc/passwd" '("/toto" "/titi")) 
   => "/etc/passwd"
(find-file/path "passwd" '("/toto" "/etc"))
   => "/etc/passwd"
(find-file/path "pass-wd" '("." "/etc"))
   => #f

make-static-library-name namebigloo procedure
Make a static library name from name by adding the static library regular suffix.

make-shared-library-name namebigloo procedure
Make a shared library name from name by adding the shared library regular suffix.

file-exists? stringbigloo procedure
This procedure returns #t if the file string exists. Otherwise it returns #f.

file-gzip? stringbigloo procedure
This procedure returns #t if and only if the file string exists and can be unzip by Bigloo. Otherwise it returns #f.

delete-file stringbigloo procedure
Deletes the file named string. The result of this procedure is #f is the operation succeeded. The result is #t otherwise.

rename-file string1 string2bigloo procedure
Renames the file string1 as string2. The two files have to be located on the same file system. If the renaming succeeds, the result is #t, otherwise it is #f.

copy-file string1 string2bigloo procedure
Copies the file string1 into string2. If the copy succeeds, the result is #t, otherwise it is #f.

directory? stringbigloo procedure
This procedure returns #t if the file string exists and is a directory. Otherwise it returns #f.

make-directory stringbigloo procedure
Creates a new directory named string. It returns #t if the directory was created. It returns #f otherwise.

make-directories stringbigloo procedure
Creates a new directory named string, including any necessary but nonexistent parent directories. It returns #t if the directory was created. It returns #f otherwise. Note that if this operation fails it may have succeeded in creating some of the necessary parent directories.

delete-directory stringbigloo procedure
Deletes the directory named string. The directory must be empty in order to be deleted. The result of this procedure is unspecified.

directory->list stringbigloo procedure
If file string exists and is a directory, this function returns the list of files in string.

file-modification-time stringbigloo procedure
The date (in second) of the last modification for file string. The number of seconds is represented by a value that may be converted into a date by the means of seconds->date (see Date).

file-size stringbigloo procedure
Returns the size (in bytes) for file string. The return type is long. If an full-sized integer is needed, one may write:

(let ((sz::llong (file-size <PATH>)))
 ...)

On error, -1 is returned.

file-uid stringbigloo procedure
file-gid stringbigloo procedure
The functions return the user id (an integer) and group id (an integer) for file string. On error, -1 is returned.

file-mode stringbigloo procedure
Returns the file access mode (an integer). On error -1 is returned.

chmod string [option]bigloo procedure
Change the access mode of the file named string. The option must be either a list of the following symbols read, write and execute or an integer. If the operation succeeds, chmod returns #t. It returns #f otherwise. The argument option can also be an integer that represents the native file permission. Example:

(chmod (make-file-name (getenv "HOME") ".bigloorc") 'read 'write)
(chmod (make-file-name (getenv "HOME") ".bigloorc") #o777)


5.7 Process support

Bigloo provides access to Unix-like processes as first class objects. The implementation and this documentation are to a great extent copies of the STk [Gallesio95] process support. Basically, a process contains four informations: the standard Unix process identification (aka PID) and the three standard files of the process.

run-process command arg...bigloo procedure
run-process creates a new process and run the executable specified in command. The arg correspond to the command line arguments. When is process completes its execution, non pipe associated ports are automatically closed. Pipe associated ports have to be explicitly closed by the program. The following values of p have a special meaning:
  • input: permits to redirect the standard input file of the process. Redirection can come from a file or from a pipe. To redirect the standard input from a file, the name of this file must be specified after input:. Use the special keyword pipe: to redirect the standard input from a pipe.

  • output: permits to redirect the standard output file of the process. Redirection can go to a file or to a pipe. To redirect the standard output to a file, the name of this file must be specified after output:. Use the special keyword pipe: to redirect the standard output to a pipe.

  • error: permits to redirect the standard error file of the process. Redirection can go to a file or to a pipe. To redirect the standard error to a file, the name of this file must be specified after error:. Use the special keyword pipe: to redirect the standard error to a pipe.

  • wait: must be followed by a boolean value. This value specifies if the process must be ran asynchronously or not. By default, the process is run asynchronously (i.e. wait: if #f).

  • host: must be followed by a string. This string represents the name of the machine on which the command must be executed. This option uses the external command rsh. The shell variable PATH must be correctly set for accessing it without specifying its absolute path.

  • fork: must be followed by a boolean value. This value specifies if the process must substitute the current execution. That is, if the value is #t a new process is spawned otherwise, the current execution is stopped and replaced by the execution of command. It defaults to #t.

  • env: must be followed by a string of the form var=val. This will bound an environment variable in the spawned process. A run-process command may contain several env: arguments. The current variables of the current process are also passed to the new process.
The following example launches a process which execute the Unix command ls with the arguments -l and /bin. The lines printed by this command are stored in the file tmp/X.

(run-process "ls" "-l" "/bin" output: "/tmp/X")
The same example with a pipe for output:

(let* ((proc (run-process "ls" "-l" "/bin" output: pipe:))
       (port (process-output-port proc)))
   (let loop ((line (read-line port)))
      (if (eof-object? line)
          (close-input-port port)
          (begin
             (print line)
             (loop (read-line port))))))
One should note that the same program can be written with explicit process handling but making use of the | notation for open-input-file.

(let ((port (open-input-file "| ls -l /bin")))
   (let loop ((line (read-line port)))
      (if (eof-object? line)
          (close-input-port port)
          (begin
             (print line)
             (loop (read-line port))))))
Both input and output ports can be piped:

(let* ((proc (run-process "/usr/bin/dc" output: pipe: input: pipe:)) 
       (inport (process-input-port proc))
       (port (process-output-port proc)))
   (fprint inport "16 o")
   (fprint inport "16 i")
   (fprint inport "10")
   (fprint inport "10")
   (fprint inport "+ p")
   (flush-output-port inport)
   (let loop ((line (read-line port)))
      (if (eof-object? line)
	  (close-input-port port)
	  (begin
	     (print line)
	     (loop (read-line port))))))   -| 20
Note: The call to flush-output-port is mandatory in order to get the dc process to get its input characters.

Note: Thanks to Todd Dukes for the example and the suggestion of including it this documentation.

process? objbigloo procedure
Returns #t if obj is a process, otherwise returns #f.

process-alive? processbigloo procedure
Returns #t if process is currently running, otherwise returns #f.

close-process-ports command arg...bigloo procedure
Close the three ports associated with a process. In general the ports should not be closed before the process is terminated.

process-pid processbigloo procedure
Returns an integer value which represents the Unix identification (PID) of the process.

process-input-port processbigloo procedure
process-output-port processbigloo procedure
process-error-port processbigloo procedure
Return the file port associated to the standard input, output and error of process otherwise returns #f. Note that the returned port is opened for reading when calling process-output-port or process-error-port. It is opened for writing when calling process-input-port.

process-wait processbigloo procedure
This function stops the current process until process completion. This function returns #f when process is already terminated. It returns #t otherwise.

process-exit-status processbigloo procedure
This function returns the exit status of process if it is has finished its execution. It returns #f otherwise.

process-send-signal process sbigloo procedure
Sends the signal whose integer value is s to process. Value of s is system dependent. The result of process-send-signal is undefined.

process-kill processbigloo procedure
This function brutally kills process. The result of process-kill is undefined.

process-stop processbigloo procedure
process-continue processbigloo procedure
Those procedures are only available on systems that support job control. The function process-stop stops the execution of process and process-continue resumes its execution.

process-listbigloo procedure
This function returns the list of processes which are currently running (i.e. alive).




5.8 Socket support

Bigloo defines sockets, on systems that support them, as first class objects. Sockets permits processes to communicate even if they are on different machines. Sockets are useful for creating client-server applications. The implementation and this documentation are, to a great extent copies of the STk [Gallesio95] socket support.

make-client-socket hostname port-number #!key (buffer #t) (timeout 0)bigloo procedure
make-client-socket returns a new socket object. This socket establishes a link between the running application listening on port port-number of hostname. If keyword argument buffer is #f then the input port associated with the socket is unbuffered. This is useful for socket clients connected to servers that do not emit #\Newline character after emissions. If optional argument buffered is missing or is not to #f the input port uses a buffer. If the optional argument timeout is missing or is 0, the execution blocks until the connection is established. If the timeout is provided, the execution unblocks after timeout microseconds unless the connection is established.

If the connection cannot be established, an &io-error is raised (see Errors and Assertions).

When a socket is used in unbufferized mode the characters available on the input port must be read exclusively with read-char or read-line. It is forbidden to use read or any regular grammar. This limitation is imposed by Rgc (see Regular Parsing) that intrinsicly associates buffers with regular grammars. If the current Rgc implementation is improved on the coming version this restriction will be eliminated.

Example:
;; open a client socket on port 80:
(make-client-socket "www.inria.fr" 80) 
;; open an unbufferized connection
(make-client-socket "www.inria.fr" 80 :buffer #f)

socket? objbigloo procedure
socket-server? objbigloo procedure
socket-client? objbigloo procedure
Returns #t if obj is a socket, a socket server a socket client. Otherwise returns #f. Socket servers and socket clients are sockets.

socket-hostname socketbigloo procedure
Returns a string which contains the name of the distant host attached to socket. If socket has been created with make-client-socket this procedure returns the official name of the distant machine used for connection. If socket has been created with make-server-socket, this function returns the official name of the client connected to the socket. If no client has used yet the socket, this function returns #f.

socket-host-address socketbigloo procedure
Returns a string which contains the IP number of the distant host attached to socket. If socket has been created with make-client-socket this procedure returns the IP number of the distant machine used for connection. If socket has been created with make-server-socket, this function returns the address of the client connected to the socket. If no client has used yet the socket, this function returns #f.

socket-local-address socketbigloo procedure
Returns a string which contains the IP number of the local host attached to socket.



socket-port-number socketbigloo procedure
Returns the integer number of the port used for socket.

socket-input socketbigloo procedure
socket-output socketbigloo procedure
Returns the file port associated for reading or writing with the program connected with socket. If no connection has already been established, these functions return #f.

The following example shows how to make a client socket. Here we create a socket on port 13 of the machine ``kaolin.unice.fr''1:
(let ((s (make-client-socket "kaolin.unice.fr" 13)))
  (print "Time is: " (read-line (socket-input s)))
  (socket-shutdown  s))

make-server-socket #!key (name #f) #!optional (port 0)make-server-socket returns a new socket object. bigloo procedure
The socket will be listening on the network interface name, either on the specified port, or on a port chosen by the system (usually the first port available on the network interface). The name can be an IP number as a string, or a host name, whose first IP address will be used (as returned by the name server lookup).

socket-accept socket #!key (buffer #t) (errp #t)bigloo procedure
socket-accept waits for a client connection on the given socket. It returns a client-socket. If no client is already waiting for a connection, this procedure blocks its caller; otherwise, the first connection request on the queue of pending connections is connected to socket. This procedure must be called on a server socket created with make-server-socket. If keyword argument buffer is #f then the input port associated with the socket is unbuffered. This is useful for socket clients connected to servers that do not emit #\Newline character after emissions. If keyword argument buffer is missing or is not to #f the input port uses a buffer. The keyword argument errp is a boolean. The value #t means that if an error is raised it is signaled. Otherwise, it is omitted.

Note: When a socket is used in unbufferized mode the characters available on the input port must be read exclusively with read-char or read-line. It is forbidden to use read or any regular grammar. This limitation is imposed by Rgc (see Regular Parsing) that intrinsicly associate buffers with regular grammars. If the current Rgc implementation is improved on the coming version this restriction will be suppressed.

The following exemple is a simple server which waits for a connection on the port 12342. Once the connection with the distant program is established, we read a line on the input port associated to the socket and we write the length of this line on its output port.
(let* ((s (make-server-socket 1234))
       (s2 (socket-accept s)))
  (let ((l (read-line (socket-input s2))))
    (fprint (socket-output s2) "Length is: " (string-length l))
    (flush-output-port (socket-output s2)))
  (socket-close s2)
  (socket-shutdown s))

socket-close socketbigloo procedure
The function socket-close closes the connection established with a socket-client.

socket-shutdown socket #!optional (close #t)bigloo procedure
Socket-shutdown shutdowns the connection associated to socket. Close is a boolean; it indicates if the socket must be closed or not, when the connection is destroyed. Closing the socket forbids further connections on the same port with the socket-accept procedure. Omitting a value for close implies the closing of socket. The result of socket-shutdown is undefined.

socket-down? socketbigloo procedure
Returns #t if socket has been previously closed with socket-shutdown. It returns #f otherwise.

Here is another example of making use of sockets:

(define s1 (make-server-socket))
(define s2 #unspecified)

(dynamic-wind ;; Init: Launch an xterm with telnet running ;; on the s listening port and connect (lambda () (run-process "/usr/X11R6/bin/xterm" "-display" ":0" "-e" "telnet" "localhost" (number->string (socket-port-number s1))) (set! s2 (socket-accept s1)) (display #"\nWelcome on the socket REPL.\n\n> " (socket-output s2)) (flush-output-port (socket-output s2)))

;; Action: A toplevel like loop (lambda () (let loop () (let ((obj (eval (read (socket-input s2))))) (fprint (socket-output s2) "; Result: " obj) (display "> " (socket-output s2)) (flush-output-port (socket-output s2)) (loop))))

;; Termination: We go here when ;; -a: an error occurs ;; -b: connection is closed (lambda () (print #"Shutdown ......\n") (socket-close s2) (socket-shutdown s1)))
Here is a second example that uses sockets. It implements a client-server architecture and it uses unbufferized (see socket-accept) input ports. First, here is the code of the client:

(module client)

(let* ((s (make-client-socket "localhost" 8080 #f)) (p (socket-output s))) (display "string" p) (newline p) (display "abc" p) (flush-output-port p) (let loop () (loop)))
Then, here is the code of the server:

(module server)

(let* ((s (make-server-socket 8080)) (s2 (socket-accept s #f))) (let ((pin (socket-input s2))) (let loop () (display (read-char pin)) (flush-output-port (current-output-port)) (loop))))
At, to conclude here the source code for a server waiting for multiple consecutive connections:

(define (main argv)
   (let ((n (if (pair? (cdr argv))
                (string->integer (cadr argv))
                10))
	 (s (make-server-socket)))
      (print "s: " s)
      (let loop ((i 0))
         (if (<fx i n)
             (let ((s2 (socket-accept s)))
		(print "i: " i " " s2)
		(print (read-line (socket-input s2)))
		(socket-close s2)
                (loop (+fx i 1)))
	     (socket-shutdown s)))))
host hostnamebigloo procedure
Returns the IP number of hostname. When hostname is not found, the io-unknown-host-error exception is raided (see Errors and Assertions).


5.9 SSL Socket support

Bigloo defines SSL sockets, on systems that support them, as first class objects. SSL Sockets permits processes to communicate even if they are on different machines securely via encrypted connections. Sockets are useful for creating secure client-server applications.

make-ssl-client-socket hostname port-number [buffered] [timeout]SSL library procedure
make-ssl-client-socket returns a new socket object. In particular it returns #t to the predicate socket? and it can be used in any context where a socket created by make-client-socket can be used (see Socket).

A SSL socket establishes a link between the running application listening on port port-number of hostname. If optional argument buffered is #f then the input port associated with the socket is unbuffered. This is useful for socket clients connected to servers that do not emit #\Newline character after emissions. If optional argument buffered is missing or is not to #f the input port uses a buffer. If the optional argument timeout is missing or is 0, the execution blocks until the connection is established. If the timeout is provided, the execution unblocks after timeout microseconds unless the connection is established.

If the connection cannot be established, an &io-error is raised (see Errors and Assertions).

When a socket is used in unbufferized mode the characters available on the input port must be read exclusively with read-char or read-line. It is forbidden to use read or any regular grammar. This limitation is imposed by Rgc (see Regular Parsing) that intrinsicly associates buffers with regular grammars. If the current Rgc implementation is improved on the coming version this restriction will be eliminated.

The function make-ssl-client-socket is defined in the SSL library. A module that needs this facility must then use a library clause (see Modules). The SSL library can also be loaded from the interpreter using the library-load function (see Bigloo Libraries).

(module imap
   (library ssl)
   (main main))

(let* ((s (make-ssl-client-socket "localhost" 993)) (p (socket-output s))) (display "string" p) (newline p) (display "abc" p) (flush-output-port p) (let loop () (loop)))


5.10 Date

date? objbigloo procedure
Returns #t if and only if obj is a date as returned by make-date, current-date, or seconds->date. It returns #f otherwise.

make-date #!key (sec 0) (min 0) (hour 0) (day 0) (month 0) (year 1970) timezone (dst -1)bigloo procedure
Creates a date object from the integer values passed as argument.

Example:
(write (make-date 0 22 17 5 2 2003 0))
  -| #<date:Wed Feb  5 17:22:00 2003>
The argument dst is either -1 when the information is not available, 0 when daylight saving is disabled, 1 when daylight saving is enabled.

date-copy date #!key sec min hour day month yearbigloo procedure
Creates a new date from the argument date.

Example:
(date-copy (current-date) 1 0 0)

current-datebigloo procedure
Returns a date object representing the current date.

current-secondsbigloo procedure
Returns an elong integer representing the current date expressed in seconds.

date->secondsbigloo procedure
seconds->datebigloo procedure
Convert from date and elong.

date->string datebigloo procedure
date->utc-string datebigloo procedure
seconds->string elongbigloo procedure
seconds->utc-string elongbigloo procedure
Construct a textual representation of the date passed in argument

date-second datebigloo procedure
Returns the number of seconds of a date, in the range 0...59.

date-minute datebigloo procedure
Returns the minute of a date, in the range 0...59.

date-hour datebigloo procedure
Returns the hour of a date, in the range 0...23.

date-day datebigloo procedure
Returns the day of a date, in the range 1...31.

date-wday datebigloo procedure
date-week-day datebigloo procedure
Returns the week day of a date, in the range 1...7.

date-yday datebigloo procedure
date-year-day datebigloo procedure
Returns the year day of a date, in the range 1...366.

date-month datebigloo procedure
Returns the month of a date, in the range 1...12.

date-year datebigloo procedure
Returns the year of a date.

date-timezone datebigloo procedure
Returns the timezone of a date.

date-is-dst datebigloo procedure
Returns -1 if the information is not available, 0 is the date does not contain daylight saving adjustment, 1 if it contains a daylight saving adjustment.

+second elong1 elong2bigloo procedure
*second elong1 elong2bigloo procedure
-second elong1 elong2bigloo procedure
=second elong1 elong2bigloo procedure
>second elong1 elong2bigloo procedure
>=second elong1 elong2bigloo procedure
<second elong1 elong2bigloo procedure
<=second elong1 elong2bigloo procedure
Arithmetic operators on seconds.

integer->secondbigloo procedure
Converts a Bigloo fixnum integer into a second number.

day-secondsbigloo procedure
Returns the number of seconds contained in one day.

day-name intbigloo procedure
day-aname intbigloo procedure
Return the name and the abbreviated name of a week day.

month-name intbigloo procedure
month-aname intbigloo procedure
Return the name and the abbreviated name of a month.

date-month-length datebigloo procedure
Return the length of the month of date.

leap-year? intbigloo procedure
Returns #t if and only if the year int is a leap year. Returns #f otherwise.







1: Port 13 is generally used for testing: making a connection to it permits to know the distant system's idea of the time of day.
2: Under Unix, you can simply connect to listening socket with the telnet command. With the given example, this can be achived by typing the following command in a window shell: $ telnet localhost 1234

This Html page has been produced by Skribe.
Last update Wed Sep 13 14:41:53 2006.