~ chicken-core (master) /manual/Module (chicken base)


   1[[tags: manual]]
   2[[toc:]]
   3
   4== Module (chicken base)
   5
   6Core procedures and macros, acting as basic extensions to the R7RS
   7standard and other essential features.
   8
   9This module is used by default, unless a program is compiled with
  10the {{-explicit-use}} option.
  11
  12=== Numeric predicates
  13
  14These allow you to make a more precise differentiation between number
  15types and their properties, not provided by R7RS.
  16
  17==== fixnum?
  18
  19<procedure>(fixnum? X)</procedure>
  20
  21Returns {{#t}} if {{X}} is a fixnum, or {{#f}} otherwise.
  22
  23==== flonum?
  24
  25<procedure>(flonum? X)</procedure>
  26
  27Returns {{#t}} if {{X}} is a flonum, or {{#f}} otherwise.
  28
  29==== bignum?
  30
  31<procedure>(bignum? X)</procedure>
  32
  33Returns {{#t}} if {{X}} is a bignum (integer larger than fits in a
  34fixnum), or {{#f}} otherwise.
  35
  36==== exact-integer?
  37
  38<procedure>(exact-integer? X)</procedure>
  39
  40Returns {{#t}} if {{X}} is an exact integer (i.e., a fixnum or a
  41bignum), or {{#f}} otherwise.
  42
  43This procedure is compatible with the definition from the R7RS
  44{{(scheme base)}} library.
  45
  46==== cplxnum?
  47
  48<procedure>(cplxnum? X)</procedure>
  49
  50Returns {{#t}} if {{X}} is a true complex number (it has an imaginary
  51component), or {{#f}} otherwise.
  52
  53Please note that {{complex?}} will always return {{#t}} for any number
  54type supported by CHICKEN, so you can use this predicate if you want
  55to know the representational type of a number.
  56
  57==== ratnum?
  58
  59<procedure>(ratnum? X)</procedure>
  60
  61Returns {{#t}} if {{X}} is a true rational number (it is a fraction
  62with a denominator that's not 1), or {{#f}} otherwise.
  63
  64Please note that {{rational?}} will always return {{#t}} for any
  65number type supported by CHICKEN except complex numbers and non-finite
  66flonums, so you can use this predicate if you want to know the
  67representational type of a number.
  68
  69==== nan?
  70
  71<procedure>(nan? N)</procedure>
  72
  73Returns {{#t}} if {{N}} is not a number (a IEEE flonum NaN-value).  If
  74{{N}} is a complex number, it's considered nan if it has a real or
  75imaginary component that's nan.
  76
  77This procedure is compatible with the definition from the R7RS
  78{{(scheme inexact)}} library.
  79
  80==== infinite?
  81
  82<procedure>(infinite? N)</procedure>
  83
  84Returns {{#t}} if {{N}} is negative or positive infinity, and {{#f}}
  85otherwise.  If {{N}} is a complex number, it's considered infinite if
  86it has a real or imaginary component that's infinite.
  87
  88This procedure is compatible with the definition from the R7RS
  89{{(scheme inexact)}} library.
  90
  91==== finite?
  92
  93<procedure>(finite? N)</procedure>
  94
  95Returns {{#t}} if {{N}} represents a finite number and {{#f}}
  96otherwise.  Positive and negative infinity as well as NaNs are not
  97considered finite.  If {{N}} is a complex number, it's considered
  98finite if both the real and imaginary components are finite.
  99
 100This procedure is compatible with the definition from the R7RS
 101{{(scheme inexact)}} library.
 102
 103==== equal=?
 104
 105<procedure>(equal=? X y)</procedure>
 106
 107Similar to the standard procedure {{equal?}}, but compares numbers
 108using the {{=}} operator, so {{equal=?}} allows structural comparison
 109in combination with comparison of numerical data by value.
 110
 111
 112=== Arithmetic
 113
 114==== add1/sub1
 115
 116<procedure>(add1 N)</procedure>
 117<procedure>(sub1 N)</procedure>
 118
 119Adds/subtracts 1 from {{N}}.
 120
 121
 122==== exact-integer-nth-root
 123
 124<procedure>(exact-integer-nth-root K N)</procedure>
 125
 126Like {{exact-integer-sqrt}}, but with any base value.  Calculates
 127{{\sqrt[N]{K}}}, the {{N}}th root of {{K}} and returns two values
 128{{s}} and {{r}} where {{s^N + r = K}} and {{K < (s+1)^N}}.
 129
 130
 131==== Division with quotient and remainder
 132
 133<procedure>(quotient&remainder X Y)</procedure>
 134<procedure>(quotient&modulo X Y)</procedure>
 135
 136Returns two values: the quotient and the remainder (or modulo) of
 137{{X}} divided by {{Y}}.  Could be defined as {{(values (quotient X Y)
 138(remainder X Y))}}, but is much more efficient when dividing very
 139large numbers.
 140
 141==== signum
 142
 143<procedure>(signum N)</procedure>
 144
 145For real numbers, returns {{1}} if {{N}} is positive, {{-1}} if {{N}}
 146is negative or {{0}} if {{N}} is zero. {{signum}} is exactness
 147preserving.
 148
 149For complex numbers, returns a complex number of the same angle but
 150with magnitude 1.
 151
 152
 153=== Weak pairs
 154
 155''Weak pairs'' behave identically to regular pairs, with one
 156exception: the car value may be garbage collected.  When that happens,
 157it gets replaced with a sentinel "broken-weak-pointer" value.
 158
 159They are indistinguishable from regular pairs: {{car}}, {{cdr}}, etc
 160all work on them, {{pair?}} returns true, etc.  The {{WRITE}}
 161representation is identical to regular pairs, so they will be read
 162back as pairs.  In other words, they have no read/write invariance.
 163
 164They're the same as regular pairs for all intents and purposes.
 165However, there's a {{weak-pair?}} predicate which ''can'' distinguish
 166between regular pairs and weak pairs.
 167
 168NOTE: Due to internal limitations, {{set-car!}} on a weak pair
 169currently may cause it to hold onto the value for one more GC cycle in
 170some situations.
 171
 172==== weak-cons
 173
 174<procedure>(weak-cons obj[1] obj[2])</procedure><br>
 175
 176Returns a newly allocated weak pair whose car is obj[1] and whose cdr
 177is obj[2]. The pair is indistinguishable from normal pairs, except as
 178noted above.
 179
 180 (weak-cons 'a '())                   ===>  (a)
 181 (weak-cons '(a) '(b c d))            ===>  ((a) b c d)
 182 (weak-cons "a" '(b c))               ===>  ("a" b c)
 183 (weak-cons 'a 3)                     ===>  (a . 3)
 184 (weak-cons '(a b) 'c)                ===>  ((a b) . c)
 185
 186 (import (chicken gc))
 187
 188 (let* ((x '(a b))
 189        (y (weak-cons x 'c)))
 190   (gc #t)
 191   (car x))                           ===> (a b)
 192
 193 (let ((x (weak-cons '(a b) 'c)))
 194   (gc #t)
 195   (car x))                           ===>  #!bwp
 196
 197As the final two examples show, when something ''else'' still holds on
 198to the value that's stored in the car of a weak pair, it will not be
 199reclaimed.  But if the value is ''only'' referenced by one or more
 200weak pairs, it is reclaimed and the car of the weak pair is replaced
 201with the ''broken-weak-pointer'' value {{#!bwp}}.
 202
 203<procedure>(weak-pair? obj)</procedure><br>
 204
 205This predicate returns {{#t}} if and only if {{obj}} is a weak pair.
 206
 207 (weak-pair? (weak-cons 'a '()))      ===>  #t
 208 (weak-pair? (cons 'a '()))           ===>  #f
 209 (weak-pair? (vector 'a '()))         ===>  #f
 210
 211<procedure>(bwp-object? obj)</procedure>
 212
 213This predicate returns {{#t}} if {{obj}} is the broken-weak-pointer
 214value, otherwise {{#f}}.
 215
 216
 217=== Input/Output
 218
 219==== current-error-port
 220
 221<procedure>(current-error-port [PORT])</procedure>
 222
 223Returns default error output port. If {{PORT}} is given, then that
 224port is selected as the new current error output port.
 225
 226Note that the default error output port is not buffered. Use
 227[[Module (chicken port)#set-buffering-mode!|{{set-buffering-mode!}}]]
 228if you need a different behaviour.
 229
 230==== print
 231
 232<procedure>(print [EXP1 ...])</procedure>
 233
 234Outputs the optional arguments {{EXP1 ...}} using {{display}} and
 235writes a newline character to the port that is the value of
 236{{(current-output-port)}}. Returns {{(void)}}.
 237
 238==== print*
 239
 240<procedure>(print* [EXP1 ...])</procedure>
 241
 242Similar to {{print}}, but does not output a terminating newline
 243character and performs a {{flush-output}} after writing its arguments.
 244
 245
 246=== Interrupts and error-handling
 247
 248==== enable-warnings
 249
 250<procedure>(enable-warnings [BOOL])</procedure>
 251
 252Enables or disables warnings, depending on wether {{BOOL}} is true or
 253false.  If called with no arguments, this procedure returns {{#t}} if
 254warnings are currently enabled, or {{#f}} otherwise. Note that this is
 255not a parameter.  The current state (whether warnings are enabled or
 256disabled) is global and not thread-local.
 257
 258
 259==== error
 260
 261<procedure>(error [LOCATION] [STRING] EXP ...)</procedure>
 262
 263Prints error message, writes all extra arguments to the value of
 264{{(current-error-port)}} and invokes the current
 265exception-handler. This conforms to
 266[[http://srfi.schemers.org/srfi-23/srfi-23.html|SRFI-23]].  If
 267{{LOCATION}} is given and a symbol, it specifies the ''location'' (the
 268name of the procedure) where the error occurred.
 269
 270
 271==== assert
 272
 273<macro>(assert EXP [OBJ ...])</macro>
 274
 275Evaluates {{EXP}}, if it returns #f, {{error}} is applied to {{OBJ ...}},
 276else the result of {{EXP}} is returned.
 277When compiling in unsafe mode, assertions of this kind are disabled.
 278
 279
 280==== get-call-chain
 281
 282<procedure>(get-call-chain [START [THREAD]])</procedure>
 283
 284Returns a list with the call history. Backtrace information is only
 285generated in code compiled without {{-no-trace}} and evaluated code.
 286If the optional argument {{START}} is given, the backtrace starts at
 287this offset, i.e. when {{START}} is 1, the next to last trace-entry is
 288printed, and so on. If the optional argument {{THREAD}} is given, then
 289the call-chain will only be constructed for calls performed by this
 290thread.
 291
 292
 293
 294==== print-call-chain
 295
 296<procedure>(print-call-chain [PORT [START [THREAD [HEADER]]]])</procedure>
 297
 298Prints a backtrace of the procedure call history to {{PORT}}, which
 299defaults to {{(current-output-port)}}. The output is prefixed by the
 300{{HEADER}}, which defaults to {{"\n\tCall history:\n"}}.
 301
 302
 303==== procedure-information
 304
 305<procedure>(procedure-information PROC)</procedure>
 306
 307Returns an s-expression with debug information for the procedure
 308{{PROC}}, or {{#f}}, if {{PROC}} has no associated debug information.
 309
 310
 311==== warning
 312
 313<procedure>(warning MESSAGE [EXP ...])</procedure>
 314
 315Displays a warning message (if warnings are enabled with {{enable-warnings}}),
 316from the {{MESSAGE}}, and optional {{EXP}} arguments, then continues execution.
 317{{MESSAGE}}, and {{EXP}}, may be {{any}} object.
 318
 319
 320=== Lists
 321
 322==== alist-ref
 323
 324<procedure>(alist-ref KEY ALIST [TEST [DEFAULT]])</procedure>
 325
 326Looks up {{KEY}} in {{ALIST}} using {{TEST}} as the comparison function (or {{eqv?}} if
 327no test was given) and returns the cdr of the found pair, or {{DEFAULT}} (which defaults to {{#f}}).
 328
 329
 330==== alist-update
 331
 332<procedure>(alist-update KEY VALUE ALIST [TEST])</procedure>
 333<procedure>(alist-update! KEY VALUE ALIST [TEST])</procedure>
 334
 335If the list {{ALIST}} contains a pair of the form {{(KEY . X)}}, then this procedure
 336replaces {{X}} with {{VALUE}} and returns {{ALIST}}. If {{ALIST}} contains no such item, then
 337{{alist-update}} returns {{((KEY . VALUE) . ALIST)}}. The optional argument
 338{{TEST}} specifies the comparison procedure to search a matching pair in {{ALIST}}
 339and defaults to {{eqv?}}. {{alist-update!}} is the destructive version of {{alist-update}}.
 340
 341
 342==== atom?
 343
 344<procedure>(atom? X)</procedure>
 345
 346Returns {{#t}} if {{X}} is not a pair.
 347
 348
 349==== butlast
 350
 351<procedure>(butlast LIST)</procedure>
 352
 353Returns a fresh list with all elements but the last of {{LIST}}.
 354
 355
 356==== chop
 357
 358<procedure>(chop LIST N)</procedure>
 359
 360Returns a new list of sublists, where each sublist contains {{N}}
 361elements of {{LIST}}. If {{LIST}} has a length that is not
 362a multiple of {{N}}, then the last sublist contains the remaining
 363elements.
 364
 365<enscript highlight=scheme>
 366(chop '(1 2 3 4 5 6) 2) ==> ((1 2) (3 4) (5 6))
 367(chop '(a b c d) 3)     ==> ((a b c) (d))
 368</enscript>
 369
 370
 371==== compress
 372
 373<procedure>(compress BLIST LIST)</procedure>
 374
 375Returns a new list with elements taken from {{LIST}} with
 376corresponding true values in the list {{BLIST}}.
 377
 378<enscript highlight=scheme>
 379(define nums '(99 100 110 401 1234))
 380(compress (map odd? nums) nums)      ==> (99 401)
 381</enscript>
 382
 383
 384==== flatten
 385
 386<procedure>(flatten LIST1 ...)</procedure>
 387
 388Returns {{LIST1 ...}} concatenated together, with nested lists
 389removed (flattened).
 390
 391
 392==== foldl
 393
 394<procedure>(foldl PROCEDURE INIT LIST)</procedure>
 395
 396Applies {{PROCEDURE}} to the elements from {{LIST}}, beginning from
 397the left:
 398
 399<enscript hightlight=scheme>
 400(foldl + 0 '(1 2 3))    ==>    (+ (+ (+ 0 1) 2) 3)
 401</enscript>
 402
 403Note that the order of arguments taken by {{PROCEDURE}} is different
 404from the {{SRFI-1}} {{fold}} procedure, but matches the more natural
 405order used in Haskell and Objective Caml.
 406
 407
 408==== foldr
 409
 410<procedure>(foldr PROCEDURE INIT LIST)</procedure>
 411
 412Applies {{PROCEDURE}} to the elements from {{LIST}}, beginning from
 413the right:
 414
 415<enscript hightlight=scheme>
 416(foldr + 0 '(1 2 3))    ==>    (+ 1 (+ 2 (+ 3 0)))
 417</enscript>
 418
 419
 420==== intersperse
 421
 422<procedure>(intersperse LIST X)</procedure>
 423
 424Returns a new list with {{X}} placed between each element.
 425
 426
 427==== join
 428
 429<procedure>(join LISTOFLISTS [LIST])</procedure>
 430
 431Concatenates the lists in {{LISTOFLISTS}} with {{LIST}} placed
 432between each sublist. {{LIST}} defaults to the empty list.
 433
 434<enscript highlight=scheme>
 435(join '((a b) (c d) (e)) '(x y)) ==> (a b x y c d x y e)
 436(join '((p q) () (r (s) t)) '(-))  ==> (p q - - r (s) t)
 437</enscript>
 438
 439{{join}} could be implemented as follows:
 440
 441<enscript highlight=scheme>
 442(define (join lstoflsts #!optional (lst '()))
 443  (apply append (intersperse lstoflists lst)) )
 444</enscript>
 445
 446
 447==== rassoc
 448
 449<procedure>(rassoc KEY LIST [TEST])</procedure>
 450
 451Similar to {{assoc}}, but compares {{KEY}} with the {{cdr}} of each pair in {{LIST}} using
 452{{TEST}} as the comparison procedures (which defaults to {{eqv?}}).
 453
 454
 455==== tail?
 456
 457<procedure>(tail? X LIST)</procedure>
 458
 459Returns true if {{X}} is one of the tails (cdr's) of {{LIST}}.
 460
 461
 462=== Vectors
 463
 464==== vector-resize
 465
 466<procedure>(vector-resize VECTOR N [INIT])</procedure>
 467
 468Creates and returns a new vector with the contents of {{VECTOR}} and
 469length {{N}}. If {{N}} is greater than the original length of
 470{{VECTOR}}, then all additional items are initialized to {{INIT}}. If
 471{{INIT}} is not specified, the contents are initialized to some
 472unspecified value.
 473
 474
 475==== subvector
 476
 477<procedure>(subvector VECTOR FROM [TO])</procedure>
 478
 479Returns a new vector with elements taken from {{VECTOR}} in the
 480given range. {{TO}} defaults to {{(vector-length VECTOR)}}.
 481
 482{{subvector}} was introduced in CHICKEN 4.7.3.
 483
 484
 485=== Combinators
 486
 487
 488==== constantly
 489
 490<procedure>(constantly X ...)</procedure>
 491
 492Returns a procedure that always returns the values {{X ...}} regardless of the number and value of its arguments.
 493
 494<enscript highlight=scheme>
 495(constantly X) <=> (lambda args X)
 496</enscript>
 497
 498
 499==== complement
 500
 501<procedure>(complement PROC)</procedure>
 502
 503Returns a procedure that returns the boolean inverse of {{PROC}}.
 504
 505<enscript highlight=scheme>
 506(complement PROC) <=> (lambda (x) (not (PROC x)))
 507</enscript>
 508
 509
 510==== compose
 511
 512<procedure>(compose PROC1 PROC2 ...)</procedure>
 513
 514Returns a procedure that represents the composition of the
 515argument-procedures {{PROC1 PROC2 ...}}.
 516
 517<enscript highlight=scheme>
 518(compose F G) <=> (lambda args
 519                      (call-with-values
 520                         (lambda () (apply G args))
 521                         F))
 522</enscript>
 523
 524{{(compose)}} is equivalent to {{values}}.
 525
 526
 527==== conjoin
 528
 529<procedure>(conjoin PRED ...)</procedure>
 530
 531Returns a procedure that returns {{#t}} if its argument satisfies the
 532predicates {{PRED ...}}.
 533<enscript highlight=scheme>
 534((conjoin odd? positive?) 33)   ==>  #t
 535((conjoin odd? positive?) -33)  ==>  #f
 536</enscript>
 537
 538
 539==== disjoin
 540
 541<procedure>(disjoin PRED ...)</procedure>
 542
 543Returns a procedure that returns {{#t}} if its argument satisfies any
 544predicate {{PRED ...}}.
 545<enscript highlight=scheme>
 546((disjoin odd? positive?) 32)    ==>  #t
 547((disjoin odd? positive?) -32)   ==>  #f
 548</enscript>
 549
 550
 551==== each
 552
 553<procedure>(each PROC ...)</procedure>
 554
 555Returns a procedure that applies {{PROC ...}} to its arguments, and returns the result(s)
 556of the last procedure application. For example
 557
 558<enscript highlight=scheme>
 559(each pp eval)
 560</enscript>
 561
 562is equivalent to
 563
 564<enscript highlight=scheme>
 565(lambda args
 566  (apply pp args)
 567  (apply eval args) )
 568</enscript>
 569
 570{{(each PROC)}} is equivalent to {{PROC}} and {{(each)}} is equivalent to
 571{{void}}.
 572
 573
 574==== flip
 575
 576<procedure>(flip PROC)</procedure>
 577
 578Returns a two-argument procedure that calls {{PROC}} with its
 579arguments swapped:
 580<enscript highlight=scheme>
 581(flip PROC) <=> (lambda (x y) (PROC y x))
 582</enscript>
 583
 584
 585==== identity
 586
 587<procedure>(identity X)</procedure>
 588
 589Returns its sole argument {{X}}.
 590
 591
 592==== list-of?
 593
 594<procedure>(list-of? PRED)</procedure>
 595
 596Returns a procedure of one argument that returns {{#t}} when
 597applied to a list of elements that all satisfy the predicate procedure
 598{{PRED}}, or {{#f}} otherwise.
 599
 600<enscript highlight=scheme>
 601((list-of? even?) '(1 2 3))   ==> #f
 602((list-of? number?) '(1 2 3)) ==> #t
 603</enscript>
 604
 605
 606==== o
 607
 608<procedure>(o PROC ...)</procedure>
 609
 610A single value version of {{compose}} (slightly faster). {{(o)}} is equivalent
 611to {{identity}}.
 612
 613
 614=== User-defined named characters
 615
 616==== char-name
 617
 618<procedure>(char-name SYMBOL-OR-CHAR [CHAR-OR-FALSE])</procedure>
 619
 620This procedure can be used to inquire about character names or to
 621define new ones. With a single argument the behavior is as follows:
 622If {{SYMBOL-OR-CHAR}} is a symbol, then {{char-name}} returns
 623the character with this name, or {{#f}} if no character is defined
 624under this name. If {{SYMBOL-OR-CHAR}} is a character, then the
 625name of the character is returned as a symbol, or {{#f}} if the
 626character has no associated name.
 627
 628If the optional argument {{CHAR-OR-FALSE}} is provided and a character, then
 629{{SYMBOL-OR-CHAR}} should be a symbol that will be the new name of
 630the given character. If multiple names designate the same character,
 631then {{write}} will use the character name that was defined last.
 632If {{CHAR-OR-FALSE}} is {{#f}} instead, then {{SYMBOL-OR-CHAR}}
 633may designate a symbol naming a character or a character and any
 634defined character name for it will be removed.
 635
 636<enscript highlight=scheme>
 637(char-name 'space)                  ==> #\space
 638(char-name #\space)                 ==> space
 639(char-name 'bell)                   ==> #f
 640(char-name (integer->char 7))       ==> #f
 641(char-name 'bell (integer->char 7))
 642(char-name 'bell)                   ==> #\bell
 643(char->integer (char-name 'bell))   ==> 7
 644(char-name 'bell #f)
 645(char-name 'bell)                   ==> #f
 646</enscript>
 647
 648
 649=== The unspecified value
 650
 651==== void
 652
 653<procedure>(void ARGUMENT ...)</procedure>
 654
 655Ignores {{ARGUMENT ...}} and returns an unspecified value.
 656
 657
 658=== Continuations
 659
 660==== call/cc
 661
 662<procedure>(call/cc PROCEDURE)</procedure>
 663
 664An alias for {{call-with-current-continuation}}.
 665
 666This procedure is compatible with the definition from the R7RS
 667{{(scheme base)}} library.
 668
 669=== Symbols
 670
 671==== Symbol utilities
 672
 673===== symbol-append
 674
 675<procedure>(symbol-append SYMBOL1 ...)</procedure>
 676
 677Creates a new symbol from the concatenated names of the argument symbols
 678{{(SYMBOL1 ...)}}.
 679
 680==== Uninterned symbols ("gensyms")
 681
 682Symbols may be "interned" or "uninterned". Interned symbols are
 683registered in a global table, and when read back from a port are
 684identical to a symbol written before:
 685
 686<enscript highlight=scheme>
 687(define sym 'foo)
 688
 689(eq? sym (with-input-from-string
 690            (with-output-to-string
 691              (lambda () (write sym)))
 692	    read))
 693
 694  => #t
 695</enscript>
 696
 697Uninterned symbols on the other hand are not globally registered and so
 698multiple symbols with the same name may coexist:
 699
 700<enscript highlight=scheme>
 701(define sym (gensym 'foo))   ; sym is a uninterned symbol like "foo42"
 702
 703(eq? sym (with-input-from-string    ; the symbol read will be an interned symbol
 704            (with-output-to-string
 705              (lambda () (write sym)))
 706	    read))
 707
 708  => #f
 709
 710(eq? (string->uninterned-symbol "foo") (string->uninterned-symbol "foo"))
 711
 712  => #f
 713</enscript>
 714
 715Use uninterned symbols if you need to generate unique values that
 716can be compared quickly, for example as keys into a hash-table
 717or association list. Note that uninterned symbols lose their
 718uniqueness property when written to a file and read back in, as
 719in the example above.
 720
 721===== gensym
 722
 723<procedure>(gensym [STRING-OR-SYMBOL])</procedure>
 724
 725Returns a newly created uninterned symbol. If an argument is provided,
 726the new symbol is prefixed with that argument.
 727
 728
 729===== string->uninterned-symbol
 730
 731<procedure>(string->uninterned-symbol STRING)</procedure>
 732
 733Returns a newly created, unique symbol with the name {{STRING}}.
 734
 735
 736=== Setters
 737
 738SRFI-17 is fully implemented. For more information see:
 739[[http://srfi.schemers.org/srfi-17/srfi-17.html|SRFI-17]].
 740
 741==== setter
 742
 743<procedure>(setter PROCEDURE)</procedure>
 744
 745Returns the setter-procedure of {{PROCEDURE}}, or signals an error if
 746{{PROCEDURE}} has no associated setter-procedure.
 747
 748Note that {{(set! (setter PROC) ...)}} for a procedure that has no
 749associated setter procedure yet is a very slow operation (the old
 750procedure is replaced by a modified copy, which involves a garbage
 751collection).
 752
 753
 754==== getter-with-setter
 755
 756<procedure>(getter-with-setter GETTER SETTER)</procedure>
 757
 758Returns a copy of the procedure {{GETTER}} with the associated setter
 759procedure {{SETTER}}. Contrary to the SRFI specification, the setter
 760of the returned procedure may be changed.
 761
 762
 763=== Binding forms for optional arguments
 764
 765==== optional
 766
 767<macro>(optional ARGS DEFAULT)</macro>
 768
 769Use this form for procedures that take a single optional argument. If
 770{{ARGS}} is the empty list {{DEFAULT}} is evaluated and
 771returned, otherwise the first element of the list {{ARGS}}. It is
 772an error if {{ARGS}} contains more than one value.
 773
 774<enscript highlight=scheme>
 775(define (incr x . i) (+ x (optional i 1)))
 776(incr 10)                                   ==> 11
 777(incr 12 5)                                 ==> 17
 778</enscript>
 779
 780
 781==== let-optionals
 782
 783<macro> (let-optionals ARGS ((VAR1 DEFAULT1) ...) BODY ...)</macro>
 784
 785Binding constructs for optional procedure arguments. {{ARGS}} is
 786normally a rest-parameter taken from a lambda-list. {{let-optionals}}
 787binds {{VAR1 ...}} to available arguments in parallel, or to
 788{{DEFAULT1 ...}} if not enough arguments were provided.
 789{{let-optionals*}} binds {{VAR1 ...}} sequentially, so every variable
 790sees the previous ones. it is an error if any excess arguments are
 791provided.
 792
 793<enscript highlight=scheme>
 794(let-optionals '(one two) ((a 1) (b 2) (c 3))
 795  (list a b c) )                               ==> (one two 3)
 796</enscript>
 797
 798==== let-optionals*
 799
 800<macro> (let-optionals* ARGS ((VAR1 DEFAULT1) ... [RESTVAR]) BODY ...)</macro>
 801
 802Binding constructs for optional procedure arguments. {{ARGS}} is
 803normally a rest-parameter taken from a lambda-list. {{let-optionals}}
 804binds {{VAR1 ...}} to available arguments in parallel, or to
 805{{DEFAULT1 ...}} if not enough arguments were provided.
 806{{let-optionals*}} binds {{VAR1 ...}} sequentially, so every variable
 807sees the previous ones. If a single variable {{RESTVAR}} is given,
 808then it is bound to any remaining arguments, otherwise it is an error
 809if any excess arguments are provided.
 810
 811<enscript highlight=scheme>
 812(let-optionals* '(one two) ((a 1) (b 2) (c a))
 813  (list a b c) )                               ==> (one two one)
 814</enscript>
 815
 816=== Other binding forms
 817
 818==== and-let*
 819
 820<macro>(and-let* (BINDING ...) EXP1 EXP2 ...)</macro>
 821
 822Bind sequentially and execute body. {{BINDING}} can
 823be a list of a variable and an expression, a list with a single
 824expression, or a single variable. If the value of an expression
 825bound to a variable is {{#f}}, the {{and-let*}} form
 826evaluates to {{#f}} (and the subsequent bindings and the body
 827are not executed).  Otherwise the next binding is performed. If
 828all bindings/expressions evaluate to a true result, the body is
 829executed normally and the result of the last expression is the
 830result of the {{and-let*}} form. See also the documentation for
 831[[http://srfi.schemers.org/srfi-2/srfi-2.html|SRFI-2]].
 832
 833==== letrec*
 834
 835<macro>(letrec* ((VARIABLE EXPRESSION) ...) BODY ...)</macro>
 836
 837Implements R6RS/R7RS {{letrec*}}. {{letrec*}} is similar to {{letrec}}
 838but binds the variables sequentially and is to {{letrec}} what
 839{{let*}} is to {{let}}.
 840
 841This special form is compatible with the definition from the R7RS
 842{{(scheme base)}} library.
 843
 844==== rec
 845
 846<macro>(rec NAME EXPRESSION)</macro><br>
 847<macro>(rec (NAME VARIABLE ...) BODY ...)</macro>
 848
 849Allows simple definition of recursive definitions. {{(rec NAME EXPRESSION)}} is
 850equivalent to {{(letrec ((NAME EXPRESSION)) NAME)}} and {{(rec (NAME VARIABLE ...) BODY ...)}}
 851is the same as {{(letrec ((NAME (lambda (VARIABLE ...) BODY ...))) NAME)}}.
 852
 853==== cut
 854
 855<macro>(cut SLOT ...)</macro><br>
 856<macro>(cute SLOT ...)</macro>
 857
 858[[http://srfi.schemers.org/srfi-26/srfi-26.html|Syntactic sugar for specializing parameters]].
 859
 860==== define-values
 861
 862<macro>(define-values (NAME ...) VALUEEXP)</macro>
 863<macro>(define-values (NAME1 ... NAMEn . NAMEn+1) VALUEEXP)</macro>
 864<macro>(define-values NAME VALUEEXP)</macro>
 865
 866Defines several variables at once, with the result values of expression
 867{{VALUEEXP}}, similar to {{set!-values}}.
 868
 869This special form is compatible with the definition from the R7RS
 870{{(scheme base)}} library.
 871
 872==== fluid-let
 873
 874<macro>(fluid-let ((VAR1 X1) ...) BODY ...)</macro>
 875
 876Binds the variables {{VAR1 ...}} dynamically to the values {{X1 ...}}
 877during execution of {{BODY ...}}.  This implements
 878[[http://srfi.schemers.org/srfi-15/srfi-15.html|SRFI-15]].
 879
 880==== let-values
 881
 882<macro>(let-values (((NAME ...) VALUEEXP) ...) BODY ...)</macro>
 883
 884Binds multiple variables to the result values of {{VALUEEXP ...}}.
 885All variables are bound simultaneously.  Like {{define-values}}, the
 886{{(NAME ...)}} expression can be any basic lambda list (dotted tail
 887notation is supported).
 888
 889This special form implements
 890[[http://srfi.schemers.org/srfi-11/srfi-11.html|SRFI-11]], and it is
 891also compatible with the definition from the R7RS {{(scheme base)}}
 892library.
 893
 894
 895==== let*-values
 896
 897<macro>(let*-values (((NAME ...) VALUEEXP) ...) BODY ...)</macro>
 898
 899Binds multiple variables to the result values of {{VALUEEXP ...}}.
 900The variables are bound sequentially.  Like {{let-values}}, the
 901{{(NAME ...)}} expression can be any basic lambda list (dotted tail
 902notation is supported).
 903
 904This is also part of
 905[[http://srfi.schemers.org/srfi-11/srfi-11.html|SRFI-11]] and is also
 906compatible with the definition from the R7RS {{(scheme base)}}
 907library.
 908
 909<enscript highlight=scheme>
 910(let*-values (((a b) (values 2 3))
 911              ((p) (+ a b)) )
 912  p)                               ==> 5
 913</enscript>
 914
 915==== letrec-values
 916
 917<macro>(letrec-values (((NAME ...) VALUEEXP) ...) BODY ...)</macro>
 918
 919Binds the result values of {{VALUEEXP ...}} to multiple variables at
 920once.  All variables are mutually recursive.  Like {{let-values}}, the
 921{{(NAME ...)}} expression can be any basic lambda list (dotted tail
 922notation is supported).
 923
 924<enscript highlight=scheme>
 925(letrec-values (((odd even)
 926                   (values
 927                     (lambda (n) (if (zero? n) #f (even (sub1 n))))
 928                     (lambda (n) (if (zero? n) #t (odd (sub1 n)))) ) ) )
 929  (odd 17) )                           ==> #t
 930</enscript>
 931
 932
 933==== receive
 934
 935<macro>(receive (NAME ...) VALUEEXP BODY ...)</macro><br>
 936<macro>(receive (NAME1 ... NAMEn . NAMEn+1) VALUEEXP BODY ...)</macro><br>
 937<macro>(receive NAME VALUEEXP BODY ...)</macro><br>
 938<macro>(receive VALUEEXP)</macro>
 939
 940[[http://srfi.schemers.org/srfi-8/srfi-8.html|SRFI-8]].
 941Syntactic sugar for {{call-with-values}}. Binds variables
 942to the result values of {{VALUEEXP}} and evaluates {{BODY ...}},
 943similar {{define-values}} but lexically scoped.
 944
 945{{(receive VALUEEXP)}} is equivalent to {{(receive _ VALUEEXP _)}}.
 946This shortened form is not described by SRFI-8.
 947
 948==== set!-values
 949
 950<macro>(set!-values (NAME ...) VALUEEXP)</macro>
 951<macro>(set!-values (NAME1 ... NAMEn . NAMEn+1) VALUEEXP)</macro>
 952<macro>(set!-values NAME VALUEEXP)</macro>
 953
 954Assigns the result values of expression {{VALUEEXP}} to multiple
 955variables, similar to {{define-values}}.
 956
 957==== nth-value
 958
 959<macro>(nth-value N EXP)</macro>
 960
 961Returns the {{N}}th value (counting from zero) of the values returned
 962by expression {{EXP}}.
 963
 964
 965=== Substitution forms and macros
 966
 967==== define-constant
 968
 969<macro>(define-constant NAME CONST)</macro>
 970
 971Defines a variable with a constant value, evaluated at compile-time.
 972Any reference to such a constant should appear textually '''after'''
 973its definition. This construct is equivalent to {{define}} when
 974evaluated or interpreted.  Constant definitions should only appear at
 975toplevel. Note that constants are local to the current compilation
 976unit and are not available outside of the source file in which they
 977are defined. Names of constants still exist in the Scheme namespace
 978and can be lexically shadowed.  If the value is mutable, then the
 979compiler is careful to preserve its identity.  {{CONST}} may be any
 980constant expression, and may also refer to constants defined via
 981{{define-constant}} previously, but it must be possible to
 982evaluate the expression at compile-time.
 983
 984==== define-inline
 985
 986<macro>(define-inline (NAME VAR ...) BODY ...)</macro><br>
 987<macro>(define-inline (NAME VAR ... . VAR) BODY ...)</macro><br>
 988<macro>(define-inline NAME EXP)</macro>
 989
 990Defines an inline procedure. Any occurrence of {{NAME}} will be replaced
 991by {{EXP}} or {{(lambda (VAR ... [. VAR]) BODY ...)}}. This is similar
 992to a macro, but variable names and scope are handled correctly.
 993
 994Inline substitutions take place '''after''' macro-expansion, and any
 995reference to {{NAME}} should appear textually '''after''' its
 996definition. Inline procedures are local to the current compilation unit
 997and are not available outside of the source file in which they are
 998defined. Names of inline procedures still exist in the Scheme namespace
 999and can be lexically shadowed. Inline definitions should only appear at
 1000the toplevel.
1001
1002Note that the {{inline-limit}} compiler option does not affect inline
1003procedure expansion, and self-referential inline procedures may cause
1004the compiler to enter an infinite loop.
1005
1006In the third form, {{EXP}} must be a lambda expression.
1007
1008This construct is equivalent to {{define}} when evaluated or
1009interpreted.
1010
1011
1012=== Conditional forms
1013
1014==== unless
1015
1016<macro>(unless TEST EXP1 EXP2 ...)</macro>
1017
1018Equivalent to:
1019
1020<enscript highlight=scheme>
1021(if (not TEST) (begin EXP1 EXP2 ...))
1022</enscript>
1023
1024==== when
1025
1026<macro>(when TEST EXP1 EXP2 ...)</macro>
1027
1028Equivalent to:
1029
1030<enscript highlight=scheme>
1031(if TEST (begin EXP1 EXP2 ...))
1032</enscript>
1033
1034=== Record structures
1035
1036==== define-record
1037
1038<macro>(define-record NAME SLOTNAME ...)</macro>
1039
1040Defines a record type. This defines a number of procedures for
1041creating, accessing, and modifying record members.
1042
1043Call {{make-NAME}} to create an instance
1044of the structure (with one initialization-argument for each slot, in
1045the listed order).
1046
1047{{(NAME? STRUCT)}} tests any object for being an instance of this
1048structure.
1049
1050Slots are accessed via {{(NAME-SLOTNAME STRUCT)}}
1051and updated using {{(NAME-SLOTNAME-set!}} {{STRUCT}} {{VALUE)}}.
1052
1053<enscript highlight=scheme>
1054(define-record point x y)
1055(define p1 (make-point 123 456))
1056(point? p1)                      ==> #t
1057(point-x p1)                     ==> 123
1058(point-y-set! p1 99)
1059(point-y p1)                     ==> 99
1060</enscript>
1061
1062===== SRFI-17 setters
1063
1064{{SLOTNAME}} may alternatively also be of the form
1065
1066  (setter SLOTNAME)
1067
1068In this case the slot can be read with {{(NAME-SLOTNAME STRUCT)}} as usual,
1069and modified with {{(set! (NAME-SLOTNAME STRUCT) VALUE)}} (the slot-accessor
1070has an associated SRFI-17 "setter" procedure) instead of
1071the usual {{(NAME-SLOTNAME-set!}} {{STRUCT}} {{VALUE)}}.
1072
1073
1074<enscript highlight=scheme>
1075(define-record point (setter x) (setter y))
1076(define p1 (make-point 123 456))
1077(point? p1)                      ==> #t
1078(point-x p1)                     ==> 123
1079(set! (point-y p1) 99)
1080(point-y p1)                     ==> 99
1081</enscript>
1082
1083==== define-record-type
1084
1085<macro>(define-record-type NAME (CONSTRUCTOR TAG ...) PREDICATE (FIELD ACCESSOR [MODIFIER]) ...)</macro>
1086
1087SRFI-9 record types. For more information see the documentation for
1088[[http://srfi.schemers.org/srfi-9/srfi-9.html|SRFI-9]].
1089
1090As an extension the {{MODIFIER}} may have the form
1091{{(setter PROCEDURE)}}, which will define a SRFI-17 setter-procedure
1092for the given {{PROCEDURE}} that sets the field value.
1093Usually {{PROCEDURE}} has the same name is {{ACCESSOR}} (but it
1094doesn't have to).
1095
1096This special form is also compatible with the definition from the R7RS
1097{{(scheme base)}} library.
1098
1099==== record-printer
1100
1101<procedure>(record-printer NAME)</procedure><br>
1102
1103Returns the procedure used to print records of the type {{NAME}} if
1104one has been set with {{set-record-printer!}}, {{#f}} otherwise.
1105
1106==== set-record-printer!
1107
1108<procedure>(set-record-printer! NAME PROCEDURE)</procedure><br>
1109<procedure>(set! (record-printer NAME) PROCEDURE)</procedure>
1110
1111Defines a printing method for record of the type {{NAME}} by
1112associating a procedure with the record type. When a record of this
1113type is written using {{display, write}} or {{print}}, then
1114the procedure is called with two arguments: the record to be printed
1115and an output-port.
1116
1117<enscript highlight=scheme>
1118(define-record-type foo (make-foo x y z) foo?
1119  (x foo-x)
1120  (y foo-y)
1121  (z foo-z))
1122(define f (make-foo 1 2 3))
1123(set-record-printer! foo
1124  (lambda (x out)
1125    (fprintf out "#,(foo ~S ~S ~S)"
1126             (foo-x x) (foo-y x) (foo-z x))))
1127(define-reader-ctor 'foo make-foo)
1128(define s (with-output-to-string
1129              (lambda () (write f))))
1130s                                   ==> "#,(foo 1 2 3)"
1131(equal? f (with-input-from-string
1132              s read)))             ==> #t
1133</enscript>
1134
1135=== Other forms
1136
1137==== load
1138
1139<procedure>(load filename [evalproc])</procedure><br>
1140
1141Filename should be a string naming an existing file containing Scheme
1142source code. The load procedure reads expressions and definitions from
1143the file and evaluates them sequentially. It is unspecified whether the
1144results of the expressions are printed. The load procedure does not
1145affect the values returned by current-input-port and
1146current-output-port. Load returns an unspecified value.
1147
1148CHICKEN offers a few extensions to the R7RS definition of {{load}}:
1149
1150* The {{filename}} may also be an input port.
1151* The expressions which are read one by one from the source file are passed to the procedure indicated by the extra optional {{evalproc}} argument, which defaults to {{eval}}.
1152* On platforms that support it (currently BSD, Haiku, MacOS X, Linux, Solaris, and Windows), {{load}} can be used to load shared objects.
1153
1154Example for loading compiled programs:
1155
1156 % cat x.scm
1157 (define (hello) (print "Hello!"))
1158 % csc -s x.scm
1159 % csi -q
1160 #;1> (load "x.so")
1161 ; loading x.so ...
1162 #;2> (hello)
1163 Hello!
1164 #;3>
1165
1166There are some limitations and caveats to the CHICKEN extensions you
1167need to be aware of:
1168
1169* The second argument to {{load}} is ignored when loading compiled code.
1170* If source code is loaded from a port, then that port is closed after all expressions have been read.
1171* A compiled file can only be loaded once. Subsequent attempts to load the same file have no effect.
1172
1173==== include
1174
1175<macro>(include STRING1 STRING2 ...)</macro>
1176<macro>(include-ci STRING1 STRING2 ...)</macro>
1177
1178Include toplevel-expressions from the given source files in the currently
1179compiled/interpreted program.  If the included file has the extension
1180{{.scm}}, then it may be omitted. The file is searched for in the
1181current directory and all directories specified by the {{-include-path}}
1182option.
1183
1184{{include-ci}} works as {{include}} but reads files in case-insensitive
1185mode.
1186
1187==== include-relative
1188
1189<macro>(include-relative STRING)</macro>
1190
1191Works like {{include}}, but the filename is searched for relative to the
1192including file rather than the current directory.
1193
1194
1195=== Making extra libraries and extensions available
1196
1197==== require-extension
1198
1199<macro>(require-extension ID ...)</macro>
1200
1201This is equivalent to {{(require-library ID ...)}} but performs an implicit
1202{{import}}, if necessary. Since version 4.4.0, {{ID}} may also be an import specification
1203(using {{rename}}, {{only}}, {{except}} or {{prefix}}).
1204
1205To make long matters short - just use {{require-extension}} and it will normally figure everything out for dynamically
1206loadable extensions and core library units.
1207
1208This implementation of {{require-extension}} is compliant with [[http://srfi.schemers.org/srfi-55/srfi-55.html|SRFI-55]]
1209(see the [[http://srfi.schemers.org/srfi-55/srfi-55.html|SRFI-55]] document for more information).
1210
1211
1212==== require-library
1213
1214<macro>(require-library ID ...)</macro>
1215
1216This form does all the necessary steps to make the libraries or extensions given
1217in {{ID ...}} available. It loads syntactic extensions, if needed and generates
1218code for loading/linking with core library modules or separately installed
1219extensions.
1220
1221During interpretation/evaluation {{require-library}} performs one of the
1222following:
1223
1224* If {{ID}} names a built-in feature, then nothing is done.
1225* If {{ID}} names one of the syntactic extensions {{chicken-syntax chicken-ffi-syntax}}, then this extension will be loaded.
1226* If {{ID}} names one of the core library units shipped with CHICKEN, then a {{(load-library 'ID)}} will be performed.
1227* If {{ID}} names an installed extension with the {{syntax}} or {{require-at-runtime}} attribute, then the extensions is loaded at compile-time, probably doing a run-time {{(require ...)}} for any run-time requirements.
1228* Otherwise, {{(require-library ID)}} is equivalent to {{(require 'ID)}}.
1229
1230During compilation, one of the following happens instead:
1231
1232* If {{ID}} names a built-in feature, then nothing is done.
1233* If {{ID}} names one of the syntactic extensions {{chicken-syntax chicken-ffi-syntax}}, then this extension will be loaded at compile-time, making the syntactic extensions available in compiled code.
1234* If {{ID}} names one of the core library units shipped with CHICKEN, or if the option {{-uses ID}} has been passed to the compiler, then a {{(declare (uses ID))}} is generated.
1235* If {{ID}} names an installed extension with the {{syntax}} or {{require-at-runtime}} attribute, then the extension is loaded at compile-time, and code is emitted to {{(require ...)}} any needed run-time requirements.
1236* Otherwise {{(require-library ID)}} is equivalent to {{(require 'ID)}}.
1237
1238{{ID}} should be a pure extension name and should not contain any path prefixes (for example {{dir/lib...}} is illegal).
1239
1240{{ID}} may also be a list that designates an extension-specifier. Currently the following extension specifiers are
1241defined:
1242
1243* {{(srfi NUMBER ...)}} is required for SRFI-55 compatibility and is fully implemented
1244* {{(version ID NUMBER)}} is equivalent to {{ID}}, but checks at compile-time whether the extension named {{ID}} is installed and whether its version is equal or higher than {{NUMBER}}. {{NUMBER}} may be a string or a number, the comparison is done lexicographically (using {{string>=?}}).
1245
1246=== Process shutdown
1247
1248==== emergency-exit
1249
1250<procedure>(emergency-exit [CODE])</procedure>
1251
1252Exits the current process without flushing any buffered output (using
1253the C function {{_exit}}).  Note that the {{exit-handler}} is not called
1254when this procedure is invoked. The optional exit status code {{CODE}}
1255defaults to {{0}}.
1256
1257
1258==== exit
1259
1260<procedure>(exit [CODE])</procedure>
1261
1262Exit the running process and return exit-code, which defaults to 0
1263(Invokes {{exit-handler}}).
1264
1265Note that pending {{dynamic-wind}} thunks are ''not'' invoked when exiting your program in this way.
1266
1267
1268=== exit-handler
1269
1270<parameter>(exit-handler)</parameter>
1271
1272A procedure of a single optional argument. When {{exit}} is called,
1273then this procedure will be invoked with the exit-code as argument. The
1274default behavior is to terminate the program.
1275
1276Note that this handler is ''not'' invoked when {{emergency-exit}} is
1277used.
1278
1279
1280=== implicit-exit-handler
1281
1282<parameter>(implicit-exit-handler)</parameter>
1283
1284A procedure of no arguments. When the last toplevel expression of the
1285program has executed, then the value of this parameter is called. The
1286default behaviour is to invoke all pending finalizers.
1287
1288
1289==== on-exit
1290
1291<procedure>(on-exit THUNK)</procedure>
1292
1293Schedules the zero-argument procedures {{THUNK}} to be executed before
1294the process exits, either explicitly via {{exit}} or implicitly after
1295execution of the last top-level form. Note that finalizers for
1296unreferenced finalized data are run before exit procedures.
1297
1298
1299=== System interface
1300
1301
1302==== sleep
1303
1304<procedure>(sleep SECONDS)</procedure>
1305
1306Puts the program to sleep for {{SECONDS}}. If the scheduler is loaded
1307(for example when srfi-18 is in use) then only the calling thread is put
1308to sleep and other threads may continue executing. Otherwise, the whole
1309process is put to sleep.
1310
1311
1312=== File Input/Output
1313
1314==== flush-output
1315
1316<procedure>(flush-output [PORT])</procedure>
1317
1318Write buffered output to the given output-port. {{PORT}} defaults
1319to the value of {{(current-output-port)}}.
1320
1321=== Port predicates
1322
1323==== port-closed?
1324
1325<procedure>(port-closed? PORT)</procedure>
1326
1327Is the given {{PORT}} closed (in all directions)?
1328
1329
1330=== Built-in parameters
1331
1332Certain behavior of the interpreter and compiled programs can be
1333customized via the following built-in parameters:
1334
1335==== case-sensitive
1336
1337<parameter>(case-sensitive)</parameter>
1338
1339If true, then {{read}} reads symbols and identifiers in
1340case-sensitive mode and uppercase characters in symbols are printed
1341escaped. Defaults to {{#t}}.
1342
1343
1344==== keyword-style
1345
1346<parameter>(keyword-style)</parameter>
1347
1348Enables alternative keyword syntax, where {{STYLE}} may be either
1349{{#:prefix}} (as in Common Lisp), which recognizes symbols beginning
1350with a colon as keywords, or {{#:suffix}} (as in DSSSL), which recognizes
1351symbols ending with a colon as keywords.
1352Any other value disables the alternative syntaxes.  In the interpreter
1353the default is {{#:suffix}}.
1354
1355
1356==== parentheses-synonyms
1357
1358<parameter>(parentheses-synonyms)</parameter>
1359
1360If true, then the list delimiter synonyms {{#\[}} {{#\]}} and {{#\{}} {{#\}}} are enabled. Defaults to {{#t}}.
1361
1362
1363==== symbol-escape
1364
1365<parameter>(symbol-escape)</parameter>
1366
1367If true, then the symbol escape {{#\|}} {{#\|}} is allowed when reading
1368and printing expressions. Defaults to {{#t}}.
1369
1370
1371---
1372Previous: [[Module srfi-4]]
1373
1374Next: [[Module (chicken bitwise)]]
Trap