cyclone/docs/api/scheme/base.md
Justin Ethier fad0a908b6 WIP
2016-12-10 03:20:02 -05:00

17 KiB

Base Library

The (scheme base) library exports many of the procedures and syntax bindings that are traditionally associated with Scheme.

For more information see the R7RS Scheme Specification.

abs

(abs num)

and

(and {test1} ...)

any

(any pred lst)

append

(append list ...)

assoc

(assoc obj alist)

(assoc obj alist compare)

assq

(assq obj alist)

assv

(assv obj alist)

begin

Syntax

(begin {expression or definition} ...)

boolean=?

(boolean=? b1 b2 ...)

bytevector-copy

(bytevector-copy bytevector)

(bytevector-copy bytevector start)

(bytevector-copy bytevector start end)

bytevector-copy!

(bytevector-copy! to at from)

(bytevector-copy! to at from start)

(bytevector-copy! to at from start end)

call-with-current-continuation

(call-with-current-continuation proc)

call-with-port

(call-with-port port proc)

call-with-values

(call-with-values producer consumer)

call/cc

(call/cc proc)

case

(case {key} {clause1} {clause2} ...)

ceiling

(ceiling z)

char<=?

(char<=? c1 c2 c3 ...)

char<?

(char<?  c1 c2 c3 ...)

char=?

(char=?  c1 c2 c3 ...)

char>=?

(char>=? c1 c2 c3 ...)

char>?

(char>?  c1 c2 c3 ...)

complex?

(complex? obj) 

cond

(cond {clause1} {clause2} ...)

cond-expand

(cond-expand {ce-clause2} {ce-clause2} ...)

current-error-port

(current-error-port)

current-input-port

(current-input-port)

current-output-port

(current-output-port)

define-record-type

(define-record-type {name}

  {constructor} {pred} {field} ...)

denominator

(denominator n)

do

(do (({variable1} {init1} {step1})

     ...)

({test} {expression} ...)

{command} ...)

dynamic-wind

(dynamic-wind before thunk after)

eof-object

(eof-object)

error

(error message obj ...)

even?

(even? num)

every

(every pred lst)

exact

(exact? num)

exact-integer?

(exact-integer? num)

exact?

(exact? num)

expt

(expt z1 z2)

features

(features) 

floor

(floor z)

floor-quotient

(floor-quotient n m)

floor-remainder

(floor-remainder n m)

floor/

(floor/ n m)

flush-output-port

(flush-output-port)

(flush-output-port port)

foldl

(foldl func accum lst)

foldr

(foldr func end lst)

for-each

(for-each proc list1 list2 ...)

gcd

(gcd n1 ...)

get-output-bytevector

(get-output-bytevector port)

get-output-string

(get-output-string port)

guard

(guard ({variable}

        {cond clause1} {cond clause2} ...)

  {body})

inexact

(inexact z)

inexact?

(inexact? num)

input-port-open?

(input-port-open? port)

input-port?

(input-port? port)

lcm

(lcm n1 ...)

let

Syntax

(let {bindings} {body})

{bindings} has the form:

(({variable1} {init1}) ...)

where each {init} is an expression, and {body} is a sequence of zero or more definitions followed by a sequence of one or more expressions. It is an error for a {variable} to appear more than once in the list of variables being bound.

Semantics: The {init}'s are evaluated in the current environment (in some unspecified order), the {variable}'s are bound to fresh locations holding the results, the {body} is evaluated in the extended environment, and the values of the last expression of {body} are returned. Each binding of a {variable} has {body} as its region.

(let ((x 2) (y 3))
  (* x y)) => 6

(let ((x 2) (y 3))
  (let ((x 7)
    (z (+ x y)))
  (* z x))) => 35

let*

Syntax

(let* {bindings} {body})

{bindings} has the form:

(({variable1} {init1}) ...)

where each {init} is an expression, and {body} is a sequence of zero or more definitions followed by a sequence of one or more expressions. It is an error for a {variable} to appear more than once in the list of variables being bound.

Semantics: The let* binding construct is similar to let, but the bindings are performed sequentially from left to right, and the region of a binding indicated by ({variable} {init}) is that part of the let* expression to the right of the binding. Thus the second binding is done in an environment in which the first binding is visible, and so on.

The {variable}'s need not be distinct.

(let ((x 2) (y 3))
    (let* ((x 7)
           (z (+ x y)))
      (* z x))) => 70

let*-values

Syntax

(let*-values {mv binding spec} {body})

let-values

Syntax

(let-values {mv binding spec} {body})

letrec

Syntax

(letrec {bindings} {body})

{bindings} has the form:

(({variable1} {init1}) ...)

where each {init} is an expression, and {body} is a sequence of zero or more definitions followed by a sequence of one or more expressions. It is an error for a {variable} to appear more than once in the list of variables being bound.

Semantics: The {variable}'s are bound to fresh locations holding unspecified values, the {init}'s are evaluated in the resulting environment (in some unspecified order), each {variable} is assigned to the result of the corresponding {init}, the {body} is evaluated in the resulting environment, and the values of the last expression in {body} are returned.

Each binding of a {variable} has the entire letrec expression as its region, making it possible to define mutually recursive procedures.

(letrec ((even?
          (lambda (n)
            (if (zero? n)
                #t
                (odd? (- n 1)))))
         (odd?
          (lambda (n)
            (if (zero? n)
                #f
                (even? (- n 1))))))
  (even? 88))
      => #t

One restriction on letrec is very important: if it is not possible to evaluate each {init} without assigning or referring to the value of any {variable}, it is an error. The restriction is necessary because letrec is defined in terms of a procedure call where a lambda expression binds the {variable}'s to the values of the {init}'s. In the most common uses of letrec, all the {init}'s are lambda expressions and the restriction is satisfied automatically.

letrec*

Syntax

(letrec* {bindings} {body})

{bindings} has the form:

(({variable1} {init1}) ...)

where each {init} is an expression, and {body} is a sequence of zero or more definitions followed by a sequence of one or more expressions. It is an error for a {variable} to appear more than once in the list of variables being bound.

Semantics: The {variable}'s are bound to fresh locations, each {variable} is assigned in left-to-right order to the result of evaluating the corresponding {init}, the {body} is evaluated in the resulting environment, and the values of the last expression in {body} are returned. Despite the left-to-right evaluation and assignment order, each binding of a {variable} has the entire letrec* expression as its region, making it possible to define mutually recursive procedures.

If it is not possible to evaluate each {init} without assigning or referring to the value of the corresponding {variable} or the {variable} of any of the bindings that follow it in {bindings}, it is an error. Another restriction is that it is an error to invoke the continuation of an {init} more than once.

(letrec* ((p
            (lambda (x)
              (+ 1 (q (- x 1)))))
          (q
            (lambda (y)
              (if (zero? y)
                  0
                  (+ 1 (p (- y 1))))))
          (x (p 5))
          (y x))
  y)
    => 5

list

(list obj ...)

list-copy

(list-copy lst)

list-ref

(list-ref lst k)

list-set!

(list-set! lst k obj)

list-tail

(list-tail lst k) 

list?

(list? o)

make-constructor

(make-constructor make name)

make-getter

(make-getter sym name idx)

make-list

(make-list k )

(make-list k fill)

make-parameter

(make-parameter init)

(make-parameter init converter)

make-setter

(make-setter sym name idx)

make-string

(make-string k)

(make-string k fill)

make-type-predicate

(make-type-predicate pred name)

map

(map proc list1 list2 ...)

max

(max x1 x2 ...)

member

(member obj lst) 

(member obj lst compare) 

memq

(memq obj lst)

memv

(memv obj lst)

min

(min x1 x2 ...)

modulo

(modulo a b)

negative?

(negative? n)

newline

(newline)

(newline port) 

not

(not x)

numerator

(numerator n) n)

odd?

(odd? num)

open-input-bytevector

(open-input-bytevector bv)

open-input-string

(open-input-string string)

open-output-bytevector

(open-output-bytevector open-output-string)

open-output-string

(open-output-string)

or

(or {test1} ...)

output-port-open?

(output-port-open? port)

output-port?

(output-port? obj)

parameterize

(parameterize (({param1} {value1}) ...)

  {body})

positive?

(positive? n)

quasiquote

(quasiquote {qq template})

quotient

(quotient x y)

raise

(raise obj)

raise-continuable

(raise-continuable obj)

rational?

(rational? obj)

read-line

(read-line)

(read-line port)

read-string

(read-string k)

(read-string k port)

receive

(receive {formals} {expression} {body})

record?

(record? obj)

remainder

(remainder num1 num2)

reverse

(reverse lst)

round

(round z)

slot-set!

(slot-set! name obj idx val)

square

(square z)

string

(string char ...)

string->list

(string->list string)

(string->list string start)

(string->list string start end)

string->utf8

(string->utf8 string)

(string->utf8 string start)

(string->utf8 string start end)

string->vector

(string->vector string)

(string->vector string start)

(string->vector string start end)

string-copy

(string-copy string)

(string-copy string start)

(string-copy string end)

string-copy!

(string-copy! to at from)

(string-copy! to at from start)

(string-copy! to at from start end)

string-fill!

(string-fill! str fill)

(string-fill! str fill start)

(string-fill! str fill start end)

string-for-each

(string-for-each proc string1 string2 ...)

string-map

(string-map proc string1 string2 ...)

string<=?

(string<=? str1 str2)

string<?

(string<? str1 str2)

string=?

(string=? str1 str2)

string>=?

(string>=? str1 str2)

string>?

(string>? str1 str2)

symbol=?

(symbol=? symbol1 symbol2 symbol3 ...)

syntax-error

Syntax

(syntax-error {message} {args} ...)

truncate

(truncate z)

truncate-quotient

(truncate-quotient quotient)

truncate-remainder

(truncate-remainder remainder)

truncate/

(truncate/ n m)

type-slot-offset

(type-slot-offset name sym)

unless

(unless {test} {expression1} {expression2} ...)

utf8->string

(utf8->string bytevector)

(utf8->string bytevector start)

(utf8->string bytevector start end)

values

(values obj ...)

vector

(vector obj ...)

vector->list

(vector->list vector)

(vector->list vector start)

(vector->list vector start end)

vector->string

(vector->string vector)

(vector->string vector start)

(vector->string vector start end)

vector-append

(vector-append vector ...)

vector-copy

(vector-copy vector)

(vector-copy vector start)

(vector-copy vector start end)

vector-copy!

(vector-copy! to at from)

(vector-copy! to at from start)

(vector-copy! to at from start end)

vector-fill!

(vector-fill! vector fill)

(vector-fill! vector fill start)

(vector-fill! vector fill start end)

vector-for-each

(vector-for-each proc vector1 vector2 ...)

vector-map

(vector-map proc vector1 vector2 ...)

when

(when {test} {expression1} {expression2} ...)

with-exception-handler

(with-exception-handler handler thunk)

write-char

(write-char char)

(write-char char port)

write-string

(write-string string)

(write-string string port)

zero?

(zero? n)