comment(;;; -*- scheme -*-) comment(;;; @@PLEAC@@_NAME) comment(;;; @@SKIP@@ Guile 1.8) comment(;;; @@PLEAC@@_WEB) comment(;;; @@SKIP@@ http://www.gnu.org/software/guile/) comment(;;; @@PLEAC@@_INTRO) comment(;;; @@SKIP@@ Sections 1 - 3, and 7 - 9, largely completed using Guile 1.5; subsequent additions use Guile 1.8.) comment(;;; @@PLEAC@@_APPENDIX) comment(;;; @@SKIP@@ General-purpose, custom functions that might be used in several sections, appear here ) comment(;; Helper which aims to reduce code clutter by:) comment(;; * Replacing the oft-used, '(display item\) (newline\)' combination) comment(;; * Avoiding overuse of '(string-append\)' for simple output tasks) operator_fat(()reserved(define) operator_fat(()ident(print) ident(item) operator(.) ident(rest)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(all-item) operator_fat(()reserved(cons) ident(item) ident(rest)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()ident(display) ident(item)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) ident(all-item)operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\)) comment(;; ------------) comment(;; Slightly modified version of '(qx\)' from Chapter 4) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(popen)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(drain-output) ident(port)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(chars) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(next) operator_fat(()ident(read-char) ident(port)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eof-object?) ident(next)operator_fat(\)) comment(; Modified to not return last 'line' with newline) operator_fat(()ident(list->string) operator_fat(()ident(reverse!) operator_fat(()ident(cdr) ident(chars)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()reserved(cons) ident(next) ident(chars)operator_fat(\)) operator_fat(()ident(read-char) ident(port)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(qx) ident(pipeline)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(pipe) operator_fat(()ident(open-input-pipe) ident(pipeline)operator_fat(\))operator_fat(\)) operator_fat(()ident(output) operator_fat(()ident(drain-output) ident(pipe)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close-pipe) ident(pipe)operator_fat(\)) ident(output)operator_fat(\))operator_fat(\)) comment(;; ------------) comment(;; @@PLEAC@@_1.0) operator_fat(()reserved(define) ident(string) stringoperator_fat(\)) comment(; two characters, \\ and an n) operator_fat(()reserved(define) ident(string) stringoperator_fat(\)) comment(; a "newline" character) operator_fat(()reserved(define) ident(string) stringoperator_fat(\)) comment(; literal double quotes) operator_fat(()reserved(define) ident(string) stringoperator_fat(\)) comment(; literal single quotes) operator_fat(()reserved(define) ident(a) stringoperator_fat(\)) comment(;; @@PLEAC@@_1.1) comment(;; Use substring) operator_fat(()ident(substring) ident(str) ident(start) ident(end)operator_fat(\)) operator_fat(()ident(substring) ident(str) ident(start)operator_fat(\)) comment(;; You can fill portions of a string with another string) operator_fat(()ident(substring-move-right!) ident(str) ident(start) ident(end) ident(newstring) ident(newstart)operator_fat(\)) operator_fat(()ident(substring-move-left!) ident(str) ident(start) ident(end) ident(newstring) ident(newstart)operator_fat(\)) comment(;; Guile has a separate character type, and you can treat strings as a) comment(;; character array.) operator_fat(()ident(string-ref) ident(str) ident(pos)operator_fat(\)) operator_fat(()ident(string-set!) ident(str) ident(pos) ident(char)operator_fat(\)) operator_fat(()ident(string-fill!) ident(str) ident(char)operator_fat(\)) operator_fat(()ident(substring-fill!) ident(str) ident(start) ident(end) ident(char)operator_fat(\)) operator_fat(()reserved(define) ident(s) stringoperator_fat(\)) operator_fat(()reserved(define) ident(first) operator_fat(()ident(substring) ident(s) integer(0) integer(1)operator_fat(\))operator_fat(\)) comment(; "T") operator_fat(()reserved(define) ident(start) operator_fat(()ident(substring) ident(s) integer(5) integer(7)operator_fat(\))operator_fat(\)) comment(; "is") operator_fat(()reserved(define) ident(rest) operator_fat(()ident(substring) ident(s) integer(13)operator_fat(\))operator_fat(\)) comment(; "you have") operator_fat(()reserved(define) ident(last) operator_fat(()ident(substring) ident(s) operator_fat(()integer(1)ident(-) operator_fat(()ident(string-length) ident(s)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(; "e") operator_fat(()reserved(define) ident(end) operator_fat(()ident(substring) ident(s) operator_fat(()ident(-) operator_fat(()ident(string-length) ident(s)operator_fat(\)) integer(4)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; "have") operator_fat(()reserved(define) ident(piece) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(len) operator_fat(()ident(string-length) ident(s)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(substring) ident(s) operator_fat(()ident(-) ident(len) integer(8)operator_fat(\)) operator_fat(()ident(-) ident(len) integer(5)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(; "you") comment(;;; Or use the string library SRFI-13) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(s) stringoperator_fat(\)) operator_fat(()reserved(define) ident(first) operator_fat(()ident(string-take) ident(s) integer(1)operator_fat(\))operator_fat(\)) comment(; "T") operator_fat(()reserved(define) ident(start) operator_fat(()ident(xsubstring) ident(s) integer(5) integer(7)operator_fat(\))operator_fat(\)) comment(; "is") operator_fat(()reserved(define) ident(rest) operator_fat(()ident(xsubstring) ident(s) integer(13) ident(-)integer(1)operator_fat(\))operator_fat(\)) comment(; "you have") operator_fat(()reserved(define) ident(last) operator_fat(()ident(string-take-right) ident(s) integer(1)operator_fat(\))operator_fat(\)) comment(; "e") operator_fat(()reserved(define) ident(end) operator_fat(()ident(string-take-right) ident(s) integer(4)operator_fat(\))operator_fat(\)) comment(; "have") operator_fat(()reserved(define) ident(piece) operator_fat(()ident(xsubstring) ident(s) ident(-)integer(8) ident(-)integer(5)operator_fat(\))operator_fat(\)) comment(; "you") comment(;; Mutation of different sized strings is not allowed. You have to) comment(;; use set! to change the variable.) operator_fat(()reserved(set!) ident(s) operator_fat(()ident(string-replace) ident(s) string integer(5) integer(7)operator_fat(\))operator_fat(\)) comment(;; This wasn't what you have) operator_fat(()reserved(set!) ident(s) operator_fat(()ident(string-replace) ident(s) string integer(13) integer(25)operator_fat(\))operator_fat(\)) comment(;; This wasn't wondrous) operator_fat(()reserved(set!) ident(s) operator_fat(()ident(string-take-right) ident(s) operator_fat(()integer(1)ident(-) operator_fat(()ident(string-length) ident(s)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; his wasn't wondrous) operator_fat(()reserved(set!) ident(s) operator_fat(()ident(string-take) ident(s) integer(9)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.2) operator_fat(()reserved(define) ident(a) operator_fat(()reserved(or) ident(b) ident(c)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(a) operator_fat(()reserved(if) operator_fat(()ident(defined?) ident(b)operator_fat(\)) ident(b) ident(c)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(a) operator_fat(()reserved(or) operator_fat(()reserved(and) operator_fat(()ident(defined?) ident(b)operator_fat(\)) ident(b)operator_fat(\)) ident(c)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.3) comment(;; This doesn't really make sense in Scheme... temporary variables are) comment(;; a natural construct and cheap. If you want to swap variables in a) comment(;; block without introducing any new variable names, you can use let:) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(a) ident(b)operator_fat(\)) operator_fat(()ident(b) ident(a)operator_fat(\))operator_fat(\)) comment(;; ...) operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(alpha) ident(beta)operator_fat(\)) operator_fat(()ident(beta) ident(production)operator_fat(\)) operator_fat(()ident(production) ident(alpha)operator_fat(\))operator_fat(\)) comment(;; ...) operator_fat(\)) comment(;; @@PLEAC@@_1.4) operator_fat(()reserved(define) ident(num) operator_fat(()ident(char->integer) ident(char)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(char) operator_fat(()ident(integer->char) ident(num)operator_fat(\))operator_fat(\)) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(str) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(display) operator_fat(()ident(string-join) operator_fat(()ident(map) ident(number->string) operator_fat(()ident(map) ident(char->integer) operator_fat(()ident(string->list) ident(str)operator_fat(\))operator_fat(\))operator_fat(\)) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(lst) operator_fat(')operator_fat(()integer(115) integer(97) integer(109) integer(112) integer(108) integer(101)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) operator_fat(()ident(list->string) operator_fat(()ident(map) ident(integer->char) ident(lst)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\)) operator_fat(()reserved(letrec) operator_fat(()operator_fat(()ident(next) operator_fat(()reserved(lambda) operator_fat(()ident(c)operator_fat(\)) operator_fat(()ident(integer->char) operator_fat(()integer(1)ident(+) operator_fat(()ident(char->integer) ident(c)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(hal) stringoperator_fat(\)) operator_fat(()ident(ibm) operator_fat(()ident(list->string) operator_fat(()ident(map) ident(next) operator_fat(()ident(string->list) ident(hal)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) ident(ibm)operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.5) comment(;; Convert the string to a list of characters) operator_fat(()ident(map) ident(proc) operator_fat(()ident(string->list) ident(str)operator_fat(\))operator_fat(\)) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(apply) ident(string) operator_fat(()ident(sort) operator_fat(()ident(delete-duplicates) operator_fat(()ident(string->list) stringoperator_fat(\))operator_fat(\)) ident(charoperator_fat(\)) operator_fat(()ident(sum) operator_fat(()ident(apply) ident(+) operator_fat(()ident(map) ident(char->integer) operator_fat(()ident(string->list) ident(str)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(sum)operator_fat(\))operator_fat(\)) comment(;;; or use string-fold/string-map/string-for-each from SRFI-13) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(str) stringoperator_fat(\)) operator_fat(()ident(sum) operator_fat(()ident(string-fold) operator_fat(()reserved(lambda) operator_fat(()ident(c) ident(acc)operator_fat(\)) operator_fat(()ident(+) ident(acc) operator_fat(()ident(char->integer) ident(c)operator_fat(\))operator_fat(\))operator_fat(\)) integer(0) ident(str)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(sum)operator_fat(\))operator_fat(\)) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; sum - compute 16-bit checksum of all input files) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(checksum) ident(p)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p) operator_fat(')ident(concat)operator_fat(\))operator_fat(\)) operator_fat(()ident(sum) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eof-object?) ident(line)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(sum) operator_fat(()ident(port-filename) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(line-sum) operator_fat(()ident(string-fold) operator_fat(()reserved(lambda) operator_fat(()ident(c) ident(acc)operator_fat(\)) operator_fat(()ident(+) ident(acc) operator_fat(()ident(char->integer) ident(c)operator_fat(\))operator_fat(\))operator_fat(\)) integer(0) ident(line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p) operator_fat(')ident(concat)operator_fat(\)) operator_fat(()ident(modulo) operator_fat(()ident(+) ident(sum) ident(line-sum)operator_fat(\)) operator_fat(()integer(1)ident(-) operator_fat(()ident(expt) integer(2) integer(16)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(args) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) operator_fat(()ident(checksum) operator_fat(()ident(current-input-port)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(f)operator_fat(\)) operator_fat(()ident(call-with-input-file) ident(f) ident(checksum)operator_fat(\))operator_fat(\)) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; slowcat - emulate a s l o w line printer) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(regex)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-2)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(args) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) reserved(delay) integer(1)operator_fat(\)) operator_fat(()ident(and-let*) operator_fat(()operator_fat(()ident(p) operator_fat(()ident(pair?) ident(args)operator_fat(\))operator_fat(\)) operator_fat(()ident(m) operator_fat(()ident(string-match) string operator_fat(()ident(car) ident(args)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) reserved(delay) operator_fat(()ident(string->number) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(args) operator_fat(()ident(cdr) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(slowcat) ident(p)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(string-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(c)operator_fat(\)) operator_fat(()ident(display) ident(c)operator_fat(\)) operator_fat(()ident(usleep) operator_fat(()ident(*) integer(5) reserved(delay)operator_fat(\))operator_fat(\))operator_fat(\)) ident(line)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) operator_fat(()ident(slowcat) operator_fat(()ident(current-input-port)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(f)operator_fat(\)) operator_fat(()ident(call-with-input-file) ident(f) ident(slowcat)operator_fat(\))operator_fat(\)) ident(args)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.6) operator_fat(()reserved(define) ident(revbytes) operator_fat(()ident(list->string) operator_fat(()ident(reverse) operator_fat(()ident(string->list) ident(str)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;;; Or from SRFI-13) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(revbytes) operator_fat(()ident(string-reverse) ident(str)operator_fat(\))operator_fat(\)) operator_fat(()ident(string-reverse!) ident(str)operator_fat(\)) comment(; modifies in place) operator_fat(()reserved(define) ident(revwords) operator_fat(()ident(string-join) operator_fat(()ident(reverse) operator_fat(()ident(string-tokenize) ident(str)operator_fat(\))operator_fat(\)) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(with-input-from-file) string operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(word) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(word)operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()reserved(and) operator_fat(()ident(>) operator_fat(()ident(string-length) ident(word)operator_fat(\)) integer(5)operator_fat(\)) operator_fat(()ident(string=?) ident(word) operator_fat(()ident(string-reverse) ident(word)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(write-line) ident(word)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; A little too verbose on the command line) comment(;; guile --use-srfi=13 -c '(with-input-from-file "/usr/share/dict/words" (lambda (\) (do ((word (read-line\) (read-line\)\)\) ((eof-object? word\)\) (if (and (> (string-length word\) 5\) (string=? word (string-reverse word\)\)\) (write-line word\)\)\)\)\)') comment(;; @@PLEAC@@_1.7) comment(;; Use regexp-substitute/global) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) string ident(str) operator_fat(()reserved(lambda) operator_fat(()ident(m)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(pre-string) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(pre-len) operator_fat(()ident(string-length) ident(pre-string)operator_fat(\))operator_fat(\)) operator_fat(()ident(match-len) operator_fat(()ident(-) operator_fat(()ident(match:end) ident(m) integer(2)operator_fat(\)) operator_fat(()ident(match:start) ident(m) integer(2)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(string-append) ident(pre-string) operator_fat(()ident(make-string) operator_fat(()ident(-) operator_fat(()ident(*) ident(match-len) integer(8)operator_fat(\)) operator_fat(()ident(modulo) ident(pre-len) integer(8)operator_fat(\))operator_fat(\)) char(#\\space)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(')ident(post)operator_fat(\)) comment(;; @@PLEAC@@_1.8) comment(;; just interpolate $abc in strings:) operator_fat(()reserved(define) operator_fat(()ident(varsubst) ident(str)operator_fat(\)) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) string ident(str) operator_fat(')ident(pre) operator_fat(()reserved(lambda) operator_fat(()ident(m)operator_fat(\)) operator_fat(()ident(eval) operator_fat(()ident(string->symbol) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(current-module)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(')ident(post)operator_fat(\))operator_fat(\)) comment(;; interpolate $abc with error messages:) operator_fat(()reserved(define) operator_fat(()ident(safe-varsubst) ident(str)operator_fat(\)) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) string ident(str) operator_fat(')ident(pre) operator_fat(()reserved(lambda) operator_fat(()ident(m)operator_fat(\)) operator_fat(()ident(catch) pre_constant(#t) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(eval) operator_fat(()ident(string->symbol) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(current-module)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) ident(args) operator_fat(()ident(format) pre_constant(#f) string operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(')ident(post)operator_fat(\))operator_fat(\)) comment(;; interpolate ${(any (scheme expression\)\)} in strings:) operator_fat(()reserved(define) operator_fat(()ident(interpolate) ident(str)operator_fat(\)) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) string ident(str) operator_fat(')ident(pre) operator_fat(()reserved(lambda) operator_fat(()ident(m)operator_fat(\)) operator_fat(()ident(eval-string) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(')ident(post)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.9) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()ident(string-upcase) stringoperator_fat(\)) comment(; BO PEEP) operator_fat(()ident(string-downcase) stringoperator_fat(\)) comment(; john) operator_fat(()ident(string-titlecase) stringoperator_fat(\)) comment(; Bo) operator_fat(()ident(string-titlecase) stringoperator_fat(\)) comment(; John) operator_fat(()ident(string-titlecase) stringoperator_fat(\)) comment(; This Is A Long Line) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; randcap: filter to randomly capitalize 20% of the time) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()ident(seed->random-state) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(randcap) ident(p)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(display) operator_fat(()ident(string-map) operator_fat(()reserved(lambda) operator_fat(()ident(c)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(=) operator_fat(()ident(random) integer(5)operator_fat(\)) integer(0)operator_fat(\)) operator_fat(()ident(char-upcase) ident(c)operator_fat(\)) operator_fat(()ident(char-downcase) ident(c)operator_fat(\))operator_fat(\))operator_fat(\)) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(args) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) operator_fat(()ident(randcap) operator_fat(()ident(current-input-port)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(f)operator_fat(\)) operator_fat(()ident(call-with-input-file) ident(f) ident(randcap)operator_fat(\))operator_fat(\)) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.10) comment(;; You can do this with format. Lisp/Scheme format is a little) comment(;; different from what you may be used to with C/Perl style printf) comment(;; (actually far more powerful\) , but if you keep in mind that we use) comment(;; ~ instead of %, and , instead of . for the prefix characters, you) comment(;; won't have trouble getting used to Guile's format.) operator_fat(()ident(format) pre_constant(#f) string ident(n)operator_fat(\)) comment(;; @@PLEAC@@_1.11) operator_fat(()reserved(define) ident(var) stringoperator_fat(\)) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(regexp)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(var) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) string ident(var) operator_fat(')ident(pre) string operator_fat(')ident(post)operator_fat(\))operator_fat(\)) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(var) operator_fat(()ident(string-join) operator_fat(()ident(map) ident(string-trim) operator_fat(()ident(string-tokenize) ident(var) char(#\\newline)operator_fat(\))operator_fat(\)) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(regexp)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-14)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(dequote) ident(str)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(str) operator_fat(()reserved(if) operator_fat(()ident(char=?) operator_fat(()ident(string-ref) ident(str) integer(0)operator_fat(\)) char(#\\newline)operator_fat(\)) operator_fat(()ident(substring) ident(str) integer(1)operator_fat(\)) ident(str)operator_fat(\))operator_fat(\)) operator_fat(()ident(lines) operator_fat(()ident(string-tokenize) ident(str) char(#\\newline)operator_fat(\))operator_fat(\)) operator_fat(()ident(rx) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(leader) operator_fat(()ident(car) ident(lines)operator_fat(\))operator_fat(\)) operator_fat(()ident(lst) operator_fat(()ident(cdr) ident(lines)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(string=) ident(leader) stringoperator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(pos) operator_fat(()reserved(or) operator_fat(()ident(string-skip) operator_fat(()ident(car) ident(lines)operator_fat(\)) ident(char-set:whitespace)operator_fat(\)) integer(0)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(make-regexp) operator_fat(()ident(format) pre_constant(#f) string ident(pos)operator_fat(\)) ident(regexp/newline)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(null?) ident(lst)operator_fat(\)) operator_fat(()ident(make-regexp) operator_fat(()ident(string-append) string operator_fat(()ident(regexp-quote) ident(leader)operator_fat(\))operator_fat(\)) ident(regexp/newline)operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(pos) operator_fat(()reserved(or) operator_fat(()ident(string-prefix-length) ident(leader) operator_fat(()ident(car) ident(lst)operator_fat(\))operator_fat(\)) integer(0)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(substring) ident(leader) integer(0) ident(pos)operator_fat(\)) operator_fat(()ident(cdr) ident(lst)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) ident(rx) ident(str) operator_fat(')ident(pre) operator_fat(')ident(post)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.12) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(text) stringoperator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(wrap) ident(str) ident(max-col)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(words) operator_fat(()ident(string-tokenize) ident(str)operator_fat(\))operator_fat(\)) operator_fat(()ident(all) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(first) operator_fat(()ident(car) ident(words)operator_fat(\))operator_fat(\)) operator_fat(()ident(col) operator_fat(()ident(string-length) ident(first)operator_fat(\))operator_fat(\)) operator_fat(()ident(line) operator_fat(()ident(list) ident(first)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(len) operator_fat(()ident(string-length) ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-col) operator_fat(()ident(+) ident(col) ident(len) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(>) ident(new-col) ident(max-col)operator_fat(\)) operator_fat(()reserved(set!) ident(all) operator_fat(()reserved(cons) operator_fat(()ident(string-join) operator_fat(()ident(reverse!) ident(line)operator_fat(\)) stringoperator_fat(\)) ident(all)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(line) operator_fat(()ident(list) ident(x)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(col) ident(len)operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(set!) ident(line) operator_fat(()reserved(cons) ident(x) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(col) ident(new-col)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(cdr) ident(words)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(all) operator_fat(()reserved(cons) operator_fat(()ident(string-join) operator_fat(()ident(reverse!) ident(line)operator_fat(\)) stringoperator_fat(\)) ident(all)operator_fat(\))operator_fat(\)) operator_fat(()ident(string-join) operator_fat(()ident(reverse!) ident(all)operator_fat(\)) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) operator_fat(()ident(wrap) ident(text) integer(20)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.13) operator_fat(()reserved(define) ident(str) stringoperator_fat(\)) operator_fat(()reserved(set!) ident(str) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) string ident(str) operator_fat(')ident(pre) string ident(match:substring) operator_fat(')ident(post)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(str) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) string ident(str) operator_fat(')ident(pre) string ident(match:substring) operator_fat(')ident(post)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(str) operator_fat(()ident(string-append) string operator_fat(()ident(regexp-substitute/global) pre_constant(#f) string string operator_fat(')ident(pre) string ident(match:substring) operator_fat(')ident(post)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.14) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(str) stringoperator_fat(\)) operator_fat(()ident(string-trim) ident(str)operator_fat(\)) comment(; "space ") operator_fat(()ident(string-trim-right) ident(str)operator_fat(\)) comment(; " space") operator_fat(()ident(string-trim-both) ident(str)operator_fat(\)) comment(; "space") comment(;; @@PLEAC@@_1.15) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-2)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\)) operator_fat(()ident(ice-9) ident(format)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(parse-csv) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(csv-match) operator_fat(()ident(string-join) operator_fat(')operator_fat(()string string stringoperator_fat(\)) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(csv-rx) operator_fat(()ident(make-regexp) ident(csv-match)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(text)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(start) integer(0)operator_fat(\)) operator_fat(()ident(result) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(start) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()ident(and-let*) operator_fat(()operator_fat(()ident(m) operator_fat(()ident(regexp-exec) ident(csv-rx) ident(text) ident(start)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(result) operator_fat(()reserved(cons) operator_fat(()reserved(or) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\)) operator_fat(()ident(match:substring) ident(m) integer(3)operator_fat(\))operator_fat(\)) ident(result)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(match:end) ident(m)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(reverse) ident(result)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(line) stringoperator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) integer(0) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\)) operator_fat(()ident(fields) operator_fat(()ident(parse-csv) ident(line)operator_fat(\)) operator_fat(()ident(cdr) ident(fields)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(null?) ident(fields)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(i) operator_fat(()ident(car) ident(fields)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_1.16) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-14)operator_fat(\))operator_fat(\)) comment(;; Knuth's soundex algorithm from The Art of Computer Programming, Vol 3) operator_fat(()reserved(define) ident(soundex) operator_fat(()reserved(letrec) operator_fat(()operator_fat(()ident(chars) stringoperator_fat(\)) operator_fat(()ident(nums) stringoperator_fat(\)) operator_fat(()ident(skipchars) operator_fat(()ident(string->char-set) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(trans) operator_fat(()reserved(lambda) operator_fat(()ident(c)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(i) operator_fat(()ident(string-index) ident(chars) ident(c)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(i) operator_fat(()ident(string-ref) ident(nums) ident(i)operator_fat(\)) ident(c)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(str)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(ustr) operator_fat(()ident(string-upcase) ident(str)operator_fat(\))operator_fat(\)) operator_fat(()ident(f) operator_fat(()ident(string-ref) ident(ustr) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()ident(skip) operator_fat(()ident(trans) ident(f)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(mstr) operator_fat(()ident(string-map) ident(trans) operator_fat(()ident(string-delete) ident(ustr) ident(skipchars) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(dstr) operator_fat(()ident(string-map) operator_fat(()reserved(lambda) operator_fat(()ident(c)operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(eq?) ident(c) ident(skip)operator_fat(\)) char(#\\0)operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(set!) ident(skip) ident(c)operator_fat(\)) ident(c)operator_fat(\))operator_fat(\))operator_fat(\)) ident(mstr)operator_fat(\))operator_fat(\)) operator_fat(()ident(zstr) operator_fat(()ident(string-delete) ident(dstr) char(#\\0)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(substring) operator_fat(()ident(string-append) operator_fat(()ident(make-string) integer(1) ident(f)operator_fat(\)) ident(zstr) stringoperator_fat(\)) integer(0) integer(4)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(soundex) stringoperator_fat(\)) comment(; K530) operator_fat(()ident(soundex) stringoperator_fat(\)) comment(; K530) operator_fat(()ident(soundex) stringoperator_fat(\)) comment(; L300) operator_fat(()ident(soundex) stringoperator_fat(\)) comment(; L300) comment(;; @@PLEAC@@_1.17) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-14)operator_fat(\)) operator_fat(()ident(ice-9) ident(rw)operator_fat(\)) operator_fat(()ident(ice-9) ident(regex)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(data) string analyzed built-in => builtin chastized => chastised commandline => command-line de-allocate => deallocate dropin => drop-in hardcode => hard-code meta-data => metadata multicharacter => multi-character multiway => multi-way non-empty => nonempty non-profit => nonprofit non-trappable => nontrappable pre-define => predefine preextend => pre-extend re-compiling => recompiling reenter => re-enter turnkey => turn-key)delimiter(")>operator_fat(\)) operator_fat(()reserved(define) ident(input) operator_fat(()reserved(if) operator_fat(()ident(null?) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(current-input-port)operator_fat(\)) operator_fat(()ident(open-input-file) operator_fat(()ident(cadr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(newline-char-set) operator_fat(()ident(string->char-set) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(assoc-char-set) operator_fat(()ident(string->char-set) string)delimiter(")>operator_fat(\))operator_fat(\)) operator_fat(()ident(dict) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(line)operator_fat(\)) operator_fat(()ident(string-tokenize) ident(line) ident(assoc-char-set)operator_fat(\))operator_fat(\)) operator_fat(()ident(string-tokenize) ident(data) ident(newline-char-set)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(dict-match) operator_fat(()ident(string-join) operator_fat(()ident(map) ident(car) ident(dict)operator_fat(\)) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(input)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(regexp-substitute/global) operator_fat(()ident(current-output-port)operator_fat(\)) ident(dict-match) ident(line) operator_fat(')ident(pre) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(cadr) operator_fat(()ident(assoc) operator_fat(()ident(match:substring) ident(x) integer(0)operator_fat(\)) ident(dict)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(')ident(post)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(input) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close-port) ident(input)operator_fat(\)) comment(;; @@PLEAC@@_2.1) comment(;; Strings and numbers are separate data types in Scheme, so this) comment(;; isn't as important as it is in Perl. More often you would use the) comment(;; type predicates, string? and number?.) operator_fat(()reserved(if) operator_fat(()ident(string-match) string ident(str)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(or) operator_fat(()ident(string-match) string ident(str)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(or) operator_fat(()ident(string-match) string ident(str)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(or) operator_fat(()ident(string-match) string ident(str)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(or) operator_fat(()ident(string-match) string ident(str)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(or) operator_fat(()ident(string-match) string ident(str)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(or) operator_fat(()ident(string-match) string ident(str)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(num1) operator_fat(()ident(string->number) ident(str)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(num2) operator_fat(()ident(read)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.2) comment(;; (approx-equal? num1 num2 accuracy\) : returns #t if num1 and num2 are) comment(;; equal to accuracy number of decimal places) operator_fat(()reserved(define) operator_fat(()ident(approx-equal?) ident(num1) ident(num2) ident(accuracy)operator_fat(\)) operator_fat(()ident(<) operator_fat(()ident(abs) operator_fat(()ident(-) ident(num1) ident(num2)operator_fat(\))operator_fat(\)) operator_fat(()ident(expt) integer(10.0) operator_fat(()ident(-) ident(accuracy)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(wage) integer(536)operator_fat(\)) comment(;; $5.36/hour) operator_fat(()reserved(define) ident(week) operator_fat(()ident(*) integer(40) ident(wage)operator_fat(\))operator_fat(\)) comment(;; $214.40) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(/) ident(week) integer(100.0)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.3) operator_fat(()ident(round) ident(num)operator_fat(\)) comment(;; rounds to inexact whole number) operator_fat(()ident(inexact->exact) ident(num)operator_fat(\)) comment(;; rounds to exact integer) comment(;; You can also use format to convert numbers to more precisely) comment(;; formatted strings. Note Guile has a builtin format which is a more) comment(;; limited version of that found in the (ice-9 format\) module, to save) comment(;; load time. Basically, if you are doing anything you couldn't do) comment(;; with a series of (display\), (write\) and (newline\), then you'll need) comment(;; to use the module.) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(format)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(a) integer(0.255)operator_fat(\)) operator_fat(()reserved(define) ident(b) operator_fat(()ident(/) operator_fat(()ident(round) operator_fat(()ident(*) integer(100.0) ident(a)operator_fat(\))operator_fat(\)) integer(100.0)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(a) ident(b)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(a) ident(a)operator_fat(\)) operator_fat(()reserved(define) ident(a) operator_fat(')operator_fat(()integer(3.3) integer(3.5) integer(3.7) ident(-)integer(3.3)operator_fat(\))operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(n)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(n) operator_fat(()ident(round) ident(n)operator_fat(\)) operator_fat(()ident(floor) ident(n)operator_fat(\)) operator_fat(()ident(ceiling) ident(n)operator_fat(\))operator_fat(\))operator_fat(\)) ident(a)operator_fat(\)) comment(;; @@PLEAC@@_2.4) comment(;; numbers are radix independent internally, so you usually only) comment(;; convert on output, however to convert strings:) operator_fat(()reserved(define) operator_fat(()ident(dec->bin) ident(num)operator_fat(\)) operator_fat(()ident(number->string) operator_fat(()ident(string->number) ident(num) integer(10)operator_fat(\)) integer(2)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(bin->dec) ident(num)operator_fat(\)) operator_fat(()ident(number->string) operator_fat(()ident(string->number) ident(num) integer(2)operator_fat(\)) integer(10)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(num) operator_fat(()ident(bin->dec) stringoperator_fat(\))operator_fat(\)) comment(; 54) operator_fat(()reserved(define) ident(binstr) operator_fat(()ident(dec->bin) stringoperator_fat(\))operator_fat(\)) comment(; 110110) comment(;; @@PLEAC@@_2.5) comment(;; do is the most general loop iterator) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) ident(x) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; var init-value step-value) operator_fat(()operator_fat(()ident(>) ident(i) ident(y)operator_fat(\))operator_fat(\)) comment(; end when true) comment(;; i is set to every integer from x to y, inclusive) comment(;; ...) operator_fat(\)) comment(;; Guile also offers a while loop) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(i) ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(while) operator_fat(()ident(<=) ident(i) ident(y)operator_fat(\)) comment(;; i is set to every integer from x to y, inclusive) comment(; ...) operator_fat(()reserved(set!) ident(i) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; named let is another common loop) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(i) ident(x)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(<=) ident(i) ident(y)operator_fat(\)) comment(;; i is set to every integer from x to y, step-size 7) comment(;; ...) operator_fat(()ident(loop) operator_fat(()ident(+) ident(i) integer(7)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(; tail-recursive call) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) integer(0) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(>) ident(i) integer(2)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(i)operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(i) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()ident(while) operator_fat(()ident(<=) ident(i) integer(4)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(i)operator_fat(\)) operator_fat(()reserved(set!) ident(i) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(i) integer(5)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(<=) ident(i) integer(12)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(i)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\)) comment(;; @@PLEAC@@_2.6) comment(;; format can output roman numerals - use ~:@R) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(format)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string integer(15) integer(15)operator_fat(\)) comment(;; @@PLEAC@@_2.7) operator_fat(()ident(random) integer(5)operator_fat(\)) comment(; an integer from 0 to 4) operator_fat(()ident(random) integer(5.0)operator_fat(\)) comment(; an inexact real in the range [0,5\)) comment(;; char sets from SRFI-14 and string-unfold from SRFI-13 make a quick) comment(;; way to generate passwords) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-14)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(chars) operator_fat(()ident(char-set->string) ident(char-set:graphic)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(size) operator_fat(()ident(char-set-size) ident(char-set:graphic)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(password) operator_fat(()ident(string-unfold) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(=) ident(x) integer(8)operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(string-ref) ident(chars) operator_fat(()ident(random) ident(size)operator_fat(\))operator_fat(\))operator_fat(\)) integer(1)ident(+) integer(0)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.8) comment(;; if you're working with random numbers you'll probably want to set) comment(;; the random seed) operator_fat(()ident(seed->random-state) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\)) comment(;; you can also save random states and pass them to any of the above) comment(;; random functions) operator_fat(()reserved(define) ident(state) operator_fat(()ident(copy-random-state)operator_fat(\))operator_fat(\)) operator_fat(()ident(random:uniform)operator_fat(\)) comment(;; 0.939377327721761) operator_fat(()ident(random:uniform) ident(state)operator_fat(\)) comment(;; 0.939377327721761) comment(;; @@PLEAC@@_2.9) comment(;; @@INCOMPLETE@@) comment(;; very inefficient) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(rw)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(make-true-random) operator_fat(()reserved(letrec) operator_fat(()operator_fat(()ident(bufsize) integer(8)operator_fat(\)) operator_fat(()ident(accum) operator_fat(()reserved(lambda) operator_fat(()ident(c) ident(acc)operator_fat(\)) operator_fat(()ident(+) operator_fat(()ident(*) integer(256) ident(acc)operator_fat(\)) operator_fat(()ident(char->integer) ident(c)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(getbuf) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(call-with-input-file) string operator_fat(()reserved(lambda) operator_fat(()ident(p)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(buf) operator_fat(()ident(make-string) ident(bufsize)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(read-string!/partial) ident(buf) ident(p)operator_fat(\)) ident(buf)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(rand-proc)operator_fat(\)) operator_fat(()reserved(lambda) ident(args) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(state) operator_fat(()ident(seed->random-state) operator_fat(()ident(string-fold) ident(accum) integer(0) operator_fat(()ident(getbuf)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(apply) ident(rand-proc) operator_fat(()ident(append) ident(args) operator_fat(()ident(list) ident(state)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(urandom) operator_fat(()ident(make-true-random) ident(random)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(urandom:exp) operator_fat(()ident(make-true-random) ident(random:exp)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(urandom:normal) operator_fat(()ident(make-true-random) ident(random:normal)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(urandom:uniform) operator_fat(()ident(make-true-random) ident(random:uniform)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.10) comment(;; Guile offers a number of random distributions) operator_fat(()ident(random:exp)operator_fat(\)) comment(; an inexact real in an exponential dist with mean 1) operator_fat(()ident(random:normal)operator_fat(\)) comment(; an inexact real in a standard normal distribution) operator_fat(()ident(random:uniform)operator_fat(\)) comment(; a uniformly distributed inexact real in [0,1\)) comment(;; There are also functions to fill vectors with random distributions) comment(;; Fills vector v with inexact real random numbers the sum of whose) comment(;; squares is equal to 1.0.) operator_fat(()ident(random:hollow-sphere!) ident(v)operator_fat(\)) comment(;; Fills vector v with inexact real random numbers that are) comment(;; independent and standard normally distributed (i.e., with mean 0) comment(;; and variance 1\).) operator_fat(()ident(random:normal-vector!) ident(v)operator_fat(\)) comment(;; Fills vector v with inexact real random numbers the sum of whose) comment(;; squares is less than 1.0.) operator_fat(()ident(random:solid-sphere!) ident(v)operator_fat(\)) comment(;; @@PLEAC@@_2.11) comment(;; Guile's trigonometric functions use radians.) operator_fat(()reserved(define) ident(pi) integer(3.14159265358979)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(degrees->radians) ident(deg)operator_fat(\)) operator_fat(()ident(*) ident(pi) operator_fat(()ident(/) ident(deg) integer(180.0)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(radians->degrees) ident(rad)operator_fat(\)) operator_fat(()ident(*) integer(180.0) operator_fat(()ident(/) ident(rad) ident(pi)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(degree-sine) ident(deg)operator_fat(\)) operator_fat(()ident(sin) operator_fat(()ident(degrees->radians) ident(deg)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.12) comment(;; Guile provides the following standard trigonometric functions (and) comment(;; their hyperbolic equivalents\), defined for all real and complex) comment(;; numbers:) operator_fat(()ident(sin) ident(z)operator_fat(\)) operator_fat(()ident(cos) ident(z)operator_fat(\)) operator_fat(()ident(tan) ident(z)operator_fat(\)) operator_fat(()ident(asin) ident(z)operator_fat(\)) operator_fat(()ident(acos) ident(z)operator_fat(\)) operator_fat(()ident(atan) ident(z)operator_fat(\)) operator_fat(()ident(acos) integer(3.7)operator_fat(\)) comment(; 0.0+1.9826969446812i) comment(;; @@PLEAC@@_2.13) comment(;; Guile provides log in base e and 10 natively, defined for any real) comment(;; or complex numbers:) operator_fat(()ident(log) ident(z)operator_fat(\)) comment(; natural logarithm) operator_fat(()ident(log10) ident(z)operator_fat(\)) comment(; base-10 logarithm) comment(;; For other bases, divide by the log of the base:) operator_fat(()reserved(define) operator_fat(()ident(log-base) ident(n) ident(z)operator_fat(\)) operator_fat(()ident(/) operator_fat(()ident(log) ident(z)operator_fat(\)) operator_fat(()ident(log) ident(n)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; To avoid re-computing (log n\) for a base you want to use) comment(;; frequently, you can create a custom log function:) operator_fat(()reserved(define) operator_fat(()ident(make-log-base) ident(n)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(divisor) operator_fat(()ident(log) ident(n)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(z)operator_fat(\)) operator_fat(()ident(/) operator_fat(()ident(log) ident(z)operator_fat(\)) ident(divisor)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(log2) operator_fat(()ident(make-log-base) integer(2)operator_fat(\))operator_fat(\)) operator_fat(()ident(log2) integer(1024)operator_fat(\)) comment(;; @@PLEAC@@_2.14) comment(;; In addition to simple vectors, Guile has builtin support for) comment(;; uniform arrays of an arbitrary dimension.) comment(;; a rows x cols integer matrix) operator_fat(()reserved(define) ident(a) operator_fat(()ident(make-array) integer(0) ident(rows) ident(cols)operator_fat(\))operator_fat(\)) operator_fat(()ident(array-set!) ident(a) integer(3) ident(row) ident(col)operator_fat(\)) operator_fat(()ident(array-ref) ident(a) ident(row) ident(col)operator_fat(\)) comment(;; a 3D matrix of reals) operator_fat(()reserved(define) ident(b) operator_fat(()ident(make-array) integer(0.0) ident(x) ident(y) ident(z)operator_fat(\))operator_fat(\)) comment(;; a literal boolean truth table for logical and) operator_fat(')error(#)integer(2)operator_fat(()operator_fat(()pre_constant(#f) pre_constant(#f)operator_fat(\)) operator_fat(()pre_constant(#f) pre_constant(#t)operator_fat(\))operator_fat(\)) comment(;; simple matrix multiplication) operator_fat(()reserved(define) operator_fat(()ident(matrix-mult) ident(m1) ident(m2)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(d1) operator_fat(()ident(array-dimensions) ident(m1)operator_fat(\))operator_fat(\)) operator_fat(()ident(d2) operator_fat(()ident(array-dimensions) ident(m2)operator_fat(\))operator_fat(\)) operator_fat(()ident(m1rows) operator_fat(()ident(car) ident(d1)operator_fat(\))operator_fat(\)) operator_fat(()ident(m1cols) operator_fat(()ident(cadr) ident(d1)operator_fat(\))operator_fat(\)) operator_fat(()ident(m2rows) operator_fat(()ident(car) ident(d2)operator_fat(\))operator_fat(\)) operator_fat(()ident(m2cols) operator_fat(()ident(cadr) ident(d2)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(=) ident(m1cols) ident(m2rows)operator_fat(\))operator_fat(\)) operator_fat(()ident(error) operator_fat(')ident(index-error) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(result) operator_fat(()ident(make-array) integer(0) ident(m1rows) ident(m2cols)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) integer(0) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(=) ident(i) ident(m1rows)operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(j) integer(0) operator_fat(()integer(1)ident(+) ident(j)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(=) ident(j) ident(m2cols)operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(k) integer(0) operator_fat(()integer(1)ident(+) ident(k)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(=) ident(k) ident(m1cols)operator_fat(\))operator_fat(\)) operator_fat(()ident(array-set!) ident(result) operator_fat(()ident(+) operator_fat(()ident(array-ref) ident(result) ident(i) ident(j)operator_fat(\)) operator_fat(()ident(*) operator_fat(()ident(array-ref) ident(m1) ident(i) ident(k)operator_fat(\)) operator_fat(()ident(array-ref) ident(m2) ident(k) ident(j)operator_fat(\))operator_fat(\))operator_fat(\)) ident(i) ident(j)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(result)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(matrix-mult) operator_fat(')error(#)integer(2)operator_fat(()operator_fat(()integer(3) integer(2) integer(3)operator_fat(\)) operator_fat(()integer(5) integer(9) integer(8)operator_fat(\))operator_fat(\)) operator_fat(')error(#)integer(2)operator_fat(()operator_fat(()integer(4) integer(7)operator_fat(\)) operator_fat(()integer(9) integer(3)operator_fat(\)) operator_fat(()integer(8) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.15) comment(;; Guile has builtin support for complex numbers:) operator_fat(()reserved(define) ident(i) integer(0+1i)operator_fat(\)) comment(; 0.0+1.0i) operator_fat(()reserved(define) ident(i) operator_fat(()ident(sqrt) ident(-)integer(1)operator_fat(\))operator_fat(\)) comment(; 0.0+1.0i) operator_fat(()ident(complex?) ident(i)operator_fat(\)) comment(; #t) operator_fat(()ident(real-part) ident(i)operator_fat(\)) comment(; 0.0) operator_fat(()ident(imag-part) ident(i)operator_fat(\)) comment(; 1.0) operator_fat(()ident(*) integer(3+5i) integer(2-2i)operator_fat(\)) comment(; 16+4i) operator_fat(()ident(sqrt) integer(3+4i)operator_fat(\)) comment(; 2+i) comment(;; Classic identity: -e^(pi*i\) => 1) operator_fat(()ident(inexact->exact) operator_fat(()ident(real-part) operator_fat(()ident(-) operator_fat(()ident(exp) operator_fat(()ident(*) ident(pi) integer(0+1i)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(; 1) comment(;; @@PLEAC@@_2.16) comment(;; You can type in literal numbers in alternate radixes:) integer(#b01101101) comment(; 109 in binary) integer(#o155) comment(; 109 in octal) integer(#d109) comment(; 109 in decimal) integer(#x6d) comment(; 109 in hexadecimal) comment(;; number->string and string->number also take an optional radix:) operator_fat(()reserved(define) ident(number) operator_fat(()ident(string->number) ident(hexadecimal) integer(16)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(number) operator_fat(()ident(string->number) ident(octal) integer(8)operator_fat(\))operator_fat(\)) comment(;; format will also output in different radixes:) operator_fat(()ident(format) pre_constant(#t) string ident(num) ident(num) ident(num) ident(num)operator_fat(\)) comment(;; converting Unix file permissions read from stdin:) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(perm) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(perm)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(string->number) ident(perm) integer(8)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.17) comment(;; once again, format is our friend :\)) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(format)operator_fat(\))operator_fat(\)) comment(;; the : prefix to the D directive causes commas to be output every) comment(;; three digits.) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(random) integer(10000000000000000)operator_fat(\))operator_fat(\)) comment(; => 2,301,267,079,619,540) comment(;; the third prefix arg to the D directive is the separator character) comment(;; to use instead of a comma, useful for European style numbers:) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(random) integer(10000000000000000)operator_fat(\))operator_fat(\)) comment(; => 6.486.470.447.356.534) comment(;; the F directive, however, does not support grouping by commas. to) comment(;; achieve this, we can format the integer and fractional parts) comment(;; separately:) operator_fat(()reserved(define) operator_fat(()ident(commify) ident(num)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(int) operator_fat(()ident(inexact->exact) operator_fat(()ident(truncate) ident(num)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(=) ident(num) ident(int)operator_fat(\)) operator_fat(()ident(format) pre_constant(#f) string ident(int)operator_fat(\)) operator_fat(()ident(string-append) operator_fat(()ident(format) pre_constant(#f) string ident(int)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(str) operator_fat(()ident(format) pre_constant(#f) string ident(num)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(substring) ident(str) operator_fat(()reserved(or) operator_fat(()ident(string-index) ident(str) char(#\\.)operator_fat(\)) operator_fat(()ident(string-length) ident(str)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.18) comment(;; format can handle simple 's' plurals with ~p, and 'y/ies' plurals) comment(;; with the @ prefix:) operator_fat(()ident(format) pre_constant(#t) string ident(hours) ident(hours)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(centuries) ident(centuries)operator_fat(\)) operator_fat(()reserved(define) ident(noun-plural) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(suffixes) operator_fat(')operator_fat(()operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(()string operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(suffix-match) operator_fat(()ident(string-append) string operator_fat(()ident(string-join) operator_fat(()ident(map) ident(car) ident(suffixes)operator_fat(\)) stringoperator_fat(\)) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(suffix-rx) operator_fat(()ident(make-regexp) ident(suffix-match)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(noun)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(m) operator_fat(()ident(regexp-exec) ident(suffix-rx) ident(noun)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(m) operator_fat(()ident(string-append) operator_fat(()ident(regexp-substitute) pre_constant(#f) ident(m) operator_fat(')ident(pre)operator_fat(\)) operator_fat(()ident(cdr) operator_fat(()ident(assoc) operator_fat(()ident(match:substring) ident(m)operator_fat(\)) ident(suffixes)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(string-append) ident(noun) stringoperator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_2.19) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; very naive factoring algorithm) operator_fat(()reserved(define) operator_fat(()ident(factor) ident(n)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(factors) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(limit) operator_fat(()ident(inexact->exact) operator_fat(()ident(round) operator_fat(()ident(sqrt) ident(n)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(twos) integer(0)operator_fat(\))operator_fat(\)) comment(;; factor out 2's) operator_fat(()ident(while) operator_fat(()ident(even?) ident(n)operator_fat(\)) operator_fat(()reserved(set!) ident(n) operator_fat(()ident(ash) ident(n) ident(-)integer(1)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(twos) operator_fat(()integer(1)ident(+) ident(twos)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(>) ident(twos) integer(0)operator_fat(\)) operator_fat(()reserved(set!) ident(factors) operator_fat(()ident(list) operator_fat(()reserved(cons) integer(2) ident(twos)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; factor out odd primes) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(i) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(r) operator_fat(()ident(remainder) ident(n) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(r) integer(0)operator_fat(\)) operator_fat(()reserved(set!) ident(n) operator_fat(()ident(quotient) ident(n) ident(i)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(old-val) operator_fat(()ident(assv) ident(i) ident(factors)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-val) operator_fat(()reserved(if) ident(old-val) operator_fat(()integer(1)ident(+) operator_fat(()ident(cdr) ident(old-val)operator_fat(\))operator_fat(\)) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(factors) operator_fat(()ident(assv-set!) ident(factors) ident(i) ident(new-val)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) ident(i)operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(<) ident(i) ident(limit)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(+) integer(2) ident(i)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; remainder) operator_fat(()reserved(if) operator_fat(()ident(>) ident(n) integer(1)operator_fat(\)) operator_fat(()reserved(set!) ident(factors) operator_fat(()reserved(cons) operator_fat(()reserved(cons) ident(n) integer(1)operator_fat(\)) ident(factors)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(reverse!) ident(factors)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; pretty print a term of a factor) operator_fat(()reserved(define) operator_fat(()ident(pp-term) ident(pair)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(=) operator_fat(()ident(cdr) ident(pair)operator_fat(\)) integer(1)operator_fat(\)) operator_fat(()ident(number->string) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#f) string operator_fat(()ident(car) ident(pair)operator_fat(\)) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; factor each number given on the command line) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(n)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(factors) operator_fat(()ident(factor) ident(n)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(n) operator_fat(()ident(pp-term) operator_fat(()ident(car) ident(factors)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(pp-term) ident(x)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(cdr) ident(factors)operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(map) ident(string->number) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_3.0) comment(;; Use the builtin POSIX time functions) comment(;; get the current time) operator_fat(()ident(current-time)operator_fat(\)) comment(; number of seconds since the epoch) operator_fat(()ident(gettimeofday)operator_fat(\)) comment(; pair of seconds and microseconds since the epoch) comment(;; create a time object from an integer (e.g. returned by current-time\)) operator_fat(()ident(localtime) ident(time)operator_fat(\)) comment(; in localtime) operator_fat(()ident(gmtime) ident(time)operator_fat(\)) comment(; in UTC) comment(;; get/set broken down components of a time object) operator_fat(()ident(tm:sec) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:sec) ident(time) ident(secs)operator_fat(\)) comment(; seconds (0-59\)) operator_fat(()ident(tm:min) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:min) ident(time) ident(mins)operator_fat(\)) comment(; minutes (0-59\)) operator_fat(()ident(tm:hour) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:hour) ident(time) ident(hours)operator_fat(\)) comment(; hours (0-23\)) operator_fat(()ident(tm:mday) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:mday) ident(time) ident(mday)operator_fat(\)) comment(; day of the month (1-31\)) operator_fat(()ident(tm:mon) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:mon) ident(time) ident(month)operator_fat(\)) comment(; month (0-11\)) operator_fat(()ident(tm:year) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:year) ident(time) ident(year)operator_fat(\)) comment(; year minus 1900 (70-\)) operator_fat(()ident(tm:wday) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:wday) ident(time) ident(wday)operator_fat(\)) comment(; day of the week (0-6\)) comment(; where Sunday is 0) operator_fat(()ident(tm:yday) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:yday) ident(time) ident(yday)operator_fat(\)) comment(; day of year (0-365\)) operator_fat(()ident(tm:isdst) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:isdst) ident(time) ident(isdst)operator_fat(\)) comment(; daylight saving indicator) comment(; 0 for "no", > 0 for "yes",) comment(; < 0 for "unknown") operator_fat(()ident(tm:gmtoff) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:gmtoff) ident(time) ident(off)operator_fat(\)) comment(; time zone offset in seconds) comment(; west of UTC (-46800 to 43200\)) operator_fat(()ident(tm:zone) ident(time)operator_fat(\)) operator_fat(()ident(set-tm:zone) ident(time) ident(zone)operator_fat(\)) comment(; Time zone label (a string\),) comment(; not necessarily unique.) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(tm:yday) operator_fat(()ident(localtime) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; Or use SRFI-19 - Time and Date Procedures) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-19)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(now) operator_fat(()ident(current-date)operator_fat(\))operator_fat(\)) comment(; immutable once created) operator_fat(()ident(date-nanosecond) ident(now)operator_fat(\)) comment(; 0-9,999,999) operator_fat(()ident(date-second) ident(now)operator_fat(\)) comment(; 0-60 (60 represents a leap second\)) operator_fat(()ident(date-minute) ident(now)operator_fat(\)) comment(; 0-59) operator_fat(()ident(date-hour) ident(now)operator_fat(\)) comment(; 0-23) operator_fat(()ident(date-day) ident(now)operator_fat(\)) comment(; 0-31) operator_fat(()ident(date-month) ident(now)operator_fat(\)) comment(; 1-12) operator_fat(()ident(date-year) ident(now)operator_fat(\)) comment(; integer representing the year) operator_fat(()ident(date-year-day) ident(now)operator_fat(\)) comment(; day of year (Jan 1 is 1, etc.\)) operator_fat(()ident(date-week-day) ident(now)operator_fat(\)) comment(; day of week (Sunday is 0, etc.\)) operator_fat(()ident(date-week-number) ident(now) ident(start)operator_fat(\)) comment(; week of year, ignoring a first partial week) comment(; start is the first day of week as above) operator_fat(()ident(date-zone-offset) ident(now)operator_fat(\)) comment(; integer number of seconds east of GMT) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(date-year-day) operator_fat(()ident(current-date)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_3.1) comment(;; using format and POSIX time components) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(format)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(now) operator_fat(()ident(localtime) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(+) integer(1900) operator_fat(()ident(tm:year) ident(now)operator_fat(\))operator_fat(\)) operator_fat(()ident(tm:mon) ident(now)operator_fat(\)) operator_fat(()ident(tm:mday) ident(now)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; using format and SRFI-19 time components) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-19)operator_fat(\)) operator_fat(()ident(ice-9) ident(format)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(now) operator_fat(()ident(current-date)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(date-year) ident(now)operator_fat(\)) operator_fat(()ident(date-month) ident(now)operator_fat(\)) operator_fat(()ident(date-day) ident(now)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; using POSIX strftime with a libc time format string) operator_fat(()ident(display) operator_fat(()ident(strftime) string operator_fat(()ident(localtime) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_3.2) comment(;; set the individual components of a time struct and use mktime) operator_fat(()reserved(define) ident(time) operator_fat(()ident(localtime) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(set-tm:mday) ident(time) ident(mday)operator_fat(\)) operator_fat(()ident(set-tm:mon) ident(time) ident(mon)operator_fat(\)) operator_fat(()ident(set-tm:year) ident(time) ident(year)operator_fat(\)) operator_fat(()ident(car) operator_fat(()ident(mktime) ident(time)operator_fat(\))operator_fat(\)) comment(; mktime returns a (epoch-seconds . time\) pair) comment(;; or use SRFI-19's make-date and date->time-monotonic) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-19)operator_fat(\))operator_fat(\)) operator_fat(()ident(date->time-monotonic) operator_fat(()ident(make-date) ident(nanosecond) ident(second) ident(minute) ident(hour) ident(day) ident(month) ident(year) ident(zone-offset)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_3.3) comment(;; use localtime or gmtime with the accessors mentioned in the) comment(;; introduction to this chapter) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(time) operator_fat(()ident(localtime) ident(seconds)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; or gmtime) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(tm:hour) ident(time)operator_fat(\)) operator_fat(()ident(tm:min) ident(time)operator_fat(\)) operator_fat(()ident(tm:sec) ident(time)operator_fat(\)) operator_fat(()ident(+) integer(1900) operator_fat(()ident(tm:year) ident(time)operator_fat(\))operator_fat(\)) operator_fat(()integer(1)ident(+) operator_fat(()ident(tm:mon) ident(time)operator_fat(\))operator_fat(\)) operator_fat(()ident(tm:mday) ident(time)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or use SRFI-19) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-19)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(time) operator_fat(()ident(make-time) ident(time-monotonic) ident(nanosecond) ident(second)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) operator_fat(()ident(date->string) operator_fat(()ident(time-monotonic->date) ident(time)operator_fat(\)) stringoperator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_3.4) comment(;; just add or subtract epoch seconds) operator_fat(()reserved(define) ident(when) operator_fat(()ident(+) ident(now) ident(difference)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(then) operator_fat(()ident(-) ident(now) ident(difference)operator_fat(\))operator_fat(\)) comment(;; if you have DMYHMS values, you can convert them to times or add) comment(;; them as seconds:) operator_fat(()reserved(define) ident(birthtime) integer(96176750)operator_fat(\)) operator_fat(()reserved(define) ident(interval) operator_fat(()ident(+) integer(5) comment(; 5 seconds) operator_fat(()ident(*) integer(17) integer(60)operator_fat(\)) comment(; 17 minutes) operator_fat(()ident(*) integer(2) integer(60) integer(60)operator_fat(\)) comment(; 2 hours) operator_fat(()ident(*) integer(55) integer(60) integer(60) integer(24)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; and 55 days) operator_fat(()reserved(define) ident(then) operator_fat(()ident(+) ident(birthtime) ident(interval)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(strftime) string operator_fat(()ident(localtime) ident(then)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_3.5) comment(;; subtract the epoch seconds:) operator_fat(()reserved(define) ident(bree) integer(361535725)operator_fat(\)) operator_fat(()reserved(define) ident(nat) integer(96201950)operator_fat(\)) operator_fat(()reserved(define) ident(difference) operator_fat(()ident(-) ident(bree) ident(nat)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(difference)operator_fat(\)) comment(;; or use SRFI-19's time arithmetic procedures:) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-19)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(time1) operator_fat(()ident(make-time) ident(time-monotonic) ident(nano1) ident(sec1)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(time2) operator_fat(()ident(make-time) ident(time-monotonic) ident(nano2) ident(sec2)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(duration) operator_fat(()ident(time-difference) ident(time1) ident(time2)operator_fat(\))operator_fat(\)) operator_fat(()ident(time=?) operator_fat(()ident(subtract-duration) ident(time1) ident(duration)operator_fat(\)) ident(time2)operator_fat(\)) comment(; #t) operator_fat(()ident(time=?) operator_fat(()ident(add-duration) ident(time2) ident(duration)operator_fat(\)) ident(time1)operator_fat(\)) comment(; #t) comment(;; @@PLEAC@@_3.6) comment(;; convert to a SRFI-19 date and use the accessors) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-19)operator_fat(\))operator_fat(\)) operator_fat(()ident(date-day) ident(date)operator_fat(\)) operator_fat(()ident(date-year-day) ident(date)operator_fat(\)) operator_fat(()ident(date-week-day) ident(date)operator_fat(\)) operator_fat(()ident(date-week-number) ident(date) ident(start-day-of-week)operator_fat(\)) comment(;; @@PLEAC@@_3.7) comment(;; use the strptime function:) operator_fat(()reserved(define) ident(time-pair) operator_fat(()ident(strptime) string stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(strftime) string operator_fat(()ident(car) ident(time-pair)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or use SRFI-19's string->date:) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-19)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(date) operator_fat(()ident(string->date) string stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(date->string) ident(date)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_3.8) comment(;; use the already seen strftime:) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(strftime) string operator_fat(()ident(localtime) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or SRFI-19's date->string:) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-19)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) stringstring gives: ~A)content(\\n)delimiter(")> operator_fat(()ident(date->string) operator_fat(()ident(current-date)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) stringstring gives: ~A)content(\\n)delimiter(")> operator_fat(()ident(date->string) operator_fat(()ident(current-date)operator_fat(\)) stringoperator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_3.9) comment(;; gettimeofday will return seconds and microseconds:) operator_fat(()reserved(define) ident(t0) operator_fat(()ident(gettimeofday)operator_fat(\))operator_fat(\)) comment(;; do your work here) operator_fat(()reserved(define) ident(t1) operator_fat(()ident(gettimeofday)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(-) operator_fat(()ident(car) ident(t1)operator_fat(\)) operator_fat(()ident(car) ident(t0)operator_fat(\))operator_fat(\)) operator_fat(()ident(-) operator_fat(()ident(cdr) ident(t1)operator_fat(\)) operator_fat(()ident(cdr) ident(t0)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; you can also get more detailed info about the real and processor) comment(;; times:) operator_fat(()reserved(define) ident(runtime) operator_fat(()ident(times)operator_fat(\))operator_fat(\)) operator_fat(()ident(tms:clock) ident(runtime)operator_fat(\)) comment(; the current real time) operator_fat(()ident(tms:utime) ident(runtime)operator_fat(\)) comment(; the CPU time units used by the calling process) operator_fat(()ident(tms:stime) ident(runtime)operator_fat(\)) comment(; the CPU time units used by the system on behalf) comment(; of the calling process.) operator_fat(()ident(tms:cutime) ident(runtime)operator_fat(\)) comment(; the CPU time units used by terminated child) comment(; processes of the calling process, whose status) comment(; has been collected (e.g., using `waitpid'\).) operator_fat(()ident(tms:cstime) ident(runtime)operator_fat(\)) comment(; the CPU times units used by the system on) comment(; behalf of terminated child processes) comment(;; you can also use the time module to time execution:) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(time)operator_fat(\))operator_fat(\)) operator_fat(()ident(time) operator_fat(()ident(sleep) integer(3)operator_fat(\))operator_fat(\)) comment(;; clock utime stime cutime cstime gctime) comment(;; 3.01 0.00 0.00 0.00 0.00 0.00) comment(;; 0) comment(;; @@PLEAC@@_3.10) operator_fat(()ident(sleep) ident(i)operator_fat(\)) comment(; sleep for i seconds) operator_fat(()ident(usleep) ident(i)operator_fat(\)) comment(; sleep for i microseconds (not available on all platforms\)) comment(;; @@PLEAC@@_4.0) operator_fat(()reserved(define) ident(nested) operator_fat(')operator_fat(()string string string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(nested) operator_fat(')operator_fat(()string string operator_fat(()string stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(tune) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_4.1) operator_fat(()reserved(define) ident(a) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(a) operator_fat(')operator_fat(()string string string string stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(lines) operator_fat(()ident(map) ident(string-trim) operator_fat(()ident(string-tokenize) string char(#\\newline)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(bigarray) operator_fat(()ident(with-input-from-file) string operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(lines) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(next-line) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eof-object?) ident(next-line)operator_fat(\)) operator_fat(()ident(reverse) ident(lines)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()reserved(cons) ident(next-line) ident(lines)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(banner) stringoperator_fat(\)) operator_fat(()reserved(define) ident(name) stringoperator_fat(\)) operator_fat(()reserved(define) ident(banner) operator_fat(()ident(string-append) string ident(name) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(banner) operator_fat(()ident(format) pre_constant(#f) string ident(name)operator_fat(\))operator_fat(\)) comment(;; Advanced shell-like function is provided by guile-scsh, the Guile) comment(;; port of SCSH, the Scheme shell. Here we roll our own using the) comment(;; pipe primitives that come with core Guile.) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(popen)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(drain-output) ident(port)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(chars) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(next) operator_fat(()ident(read-char) ident(port)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eof-object?) ident(next)operator_fat(\)) operator_fat(()ident(list->string) operator_fat(()ident(reverse!) ident(chars)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()reserved(cons) ident(next) ident(chars)operator_fat(\)) operator_fat(()ident(read-char) ident(port)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(qx) ident(pipeline)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(pipe) operator_fat(()ident(open-input-pipe) ident(pipeline)operator_fat(\))operator_fat(\)) operator_fat(()ident(output) operator_fat(()ident(drain-output) ident(pipe)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close-pipe) ident(pipe)operator_fat(\)) ident(output)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(his-host) stringoperator_fat(\)) operator_fat(()reserved(define) ident(host-info) operator_fat(()ident(qx) operator_fat(()ident(format) pre_constant(#f) string ident(his-host)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(perl-info) operator_fat(()ident(qx) operator_fat(()ident(format) pre_constant(#f) string operator_fat(()ident(getpid)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(shell-info) operator_fat(()ident(qx) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(banner) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(brax) operator_fat(()ident(map) ident(string) operator_fat(()ident(string->list) string{}[])delimiter(")>operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(rings) operator_fat(()ident(string-tokenize) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(tags) operator_fat(()ident(string-tokenize) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(sample) operator_fat(()ident(string-tokenize) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(ships) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_4.2) operator_fat(()reserved(define) ident(array) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(begin) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()ident(for-each) ident(display) ident(array)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) comment(;; I have redyellowgreen marbles.) operator_fat(()reserved(begin) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(colour)operator_fat(\)) operator_fat(()ident(display) ident(colour)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) ident(array)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) comment(;; I have red yellow green marbles.) comment(;; commify - insertion of commas into list output) operator_fat(()reserved(define) operator_fat(()ident(commify) ident(strings)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(len) operator_fat(()ident(length) ident(strings)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(case) ident(len) operator_fat(()operator_fat(()integer(0)operator_fat(\)) stringoperator_fat(\)) operator_fat(()operator_fat(()integer(1)operator_fat(\)) operator_fat(()ident(car) ident(strings)operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()integer(2)operator_fat(\)) operator_fat(()ident(string-append) operator_fat(()ident(car) ident(strings)operator_fat(\)) string operator_fat(()ident(cadr) ident(strings)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()integer(3)operator_fat(\)) operator_fat(()ident(string-append) operator_fat(()ident(car) ident(strings)operator_fat(\)) string operator_fat(()ident(cadr) ident(strings)operator_fat(\)) string operator_fat(()ident(caddr) ident(strings)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(string-append) operator_fat(()ident(car) ident(strings)operator_fat(\)) string operator_fat(()ident(commify) operator_fat(()ident(cdr) ident(strings)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(lists) operator_fat(')operator_fat(()operator_fat(()stringoperator_fat(\)) operator_fat(()string stringoperator_fat(\)) operator_fat(()string string stringoperator_fat(\)) operator_fat(()string string stringoperator_fat(\)) operator_fat(()string string string stringoperator_fat(\)) operator_fat(()string stringoperator_fat(\)) operator_fat(()string string stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(list)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()ident(display) operator_fat(()ident(commify) ident(list)operator_fat(\))operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) ident(lists)operator_fat(\)) comment(;; The list is: just one thing.) comment(;; The list is: Mutt and Jeff.) comment(;; The list is: Peter, Paul, and Mary.) comment(;; The list is: To our parents, Mother Theresa, and God.) comment(;; The list is: pastrami, ham and cheese, peanut butter and jelly, and tuna.) comment(;; The list is: recycle tired, old phrases and ponder big, happy thoughts.) comment(;; The list is: recycle tired, old phrases, ponder big, happy thoughts, and sleep and dream peacefully.) comment(;; @@PLEAC@@_4.3) comment(;;-----------------------------) comment(;; Scheme does not normally grow and shrink arrays in the way that) comment(;; Perl can. The more usual operations are adding and removing from) comment(;; the head of a list using the `cons' and `cdr' procedures.) comment(;; However ...) operator_fat(()reserved(define) operator_fat(()ident(grow/shrink) ident(list) ident(new-size)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(size) operator_fat(()ident(length) ident(list)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(<) ident(size) ident(new-size)operator_fat(\)) operator_fat(()ident(grow/shrink) operator_fat(()reserved(cons) string ident(list)operator_fat(\)) ident(new-size)operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(>) ident(size) ident(new-size)operator_fat(\)) operator_fat(()ident(grow/shrink) operator_fat(()ident(cdr) ident(list)operator_fat(\)) ident(new-size)operator_fat(\))operator_fat(\)) operator_fat(()ident(else) ident(list)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(element) ident(list) ident(i)operator_fat(\)) operator_fat(()ident(list-ref) ident(list) operator_fat(()ident(-) operator_fat(()ident(length) ident(list)operator_fat(\)) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(set-element) ident(list) ident(i) ident(value)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(>=) ident(i) operator_fat(()ident(length) ident(list)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(list) operator_fat(()ident(grow/shrink) ident(list) operator_fat(()ident(-) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(set-car!) operator_fat(()ident(list-cdr-ref) ident(list) operator_fat(()ident(-) operator_fat(()ident(length) ident(list)operator_fat(\)) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) ident(list)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(what-about) ident(list)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(len) operator_fat(()ident(length) ident(list)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(len)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(-) ident(len) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()reserved(if) operator_fat(()ident(>) ident(len) integer(3)operator_fat(\)) operator_fat(()ident(element) ident(list) integer(3)operator_fat(\)) stringoperator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; In the emulation of Perl arrays implemented here, the elements are) comment(;; in reverse order when compared to normal Scheme lists.) operator_fat(()reserved(define) ident(people) operator_fat(()ident(reverse) operator_fat(')operator_fat(()string string string stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(what-about) ident(people)operator_fat(\)) comment(;;-----------------------------) comment(;; The array now has 4 elements.) comment(;; The index of the last element is 3.) comment(;; Element #3 is `Young'.) comment(;;-----------------------------) operator_fat(()reserved(set!) ident(people) operator_fat(()ident(grow/shrink) ident(people) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()ident(what-about) ident(people)operator_fat(\)) comment(;;-----------------------------) comment(;; The array now has 3 elements.) comment(;; The index of the last element is 2.) comment(;; Element #3 is `'.) comment(;;-----------------------------) operator_fat(()reserved(set!) ident(people) operator_fat(()ident(grow/shrink) ident(people) integer(10001)operator_fat(\))operator_fat(\)) operator_fat(()ident(what-about) ident(people)operator_fat(\)) comment(;;-----------------------------) comment(;; The array now has 10001 elements.) comment(;; The index of the last element is 10000.) comment(;; Element #3 is `'.) comment(;;-----------------------------) comment(;; @@PLEAC@@_4.4) comment(; Using a 'list' i.e. chain of pairs) operator_fat(()reserved(define) ident(*mylist*) operator_fat(')operator_fat(()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) comment(; Apply procedure to each member of 'mylist') operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()ident(print) ident(item)operator_fat(\))operator_fat(\)) ident(*mylist*)operator_fat(\)) comment(;; ------------) comment(; Using a 'vector' i.e. one-dimensional array) operator_fat(()reserved(define) ident(*bad-users*) operator_fat(')operator_fat(#()string string string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(complain) ident(user)operator_fat(\)) operator_fat(()ident(print) string ident(user)operator_fat(\))operator_fat(\)) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(user)operator_fat(\)) operator_fat(()ident(complain) ident(user)operator_fat(\))operator_fat(\)) ident(*bad-users*)operator_fat(\)) comment(;; ------------) comment(; Could probably get away with sorting a list of strings ...) operator_fat(()reserved(define) ident(*sorted-environ*) operator_fat(()ident(sort) operator_fat(()ident(environ)operator_fat(\)) ident(stringenv-string) ident(a)operator_fat(\)) operator_fat(()ident(string-append) operator_fat(()ident(car) ident(a)operator_fat(\)) string operator_fat(()ident(cdr) ident(a)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(env-string->cons) ident(s)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(key-value) operator_fat(()ident(string-split) ident(s) char(#\\=)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(car) ident(key-value)operator_fat(\)) operator_fat(()ident(cadr) ident(key-value)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*sorted-environ-assoc*) operator_fat(()ident(sort) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(var)operator_fat(\)) operator_fat(()ident(env-string->cons) ident(var)operator_fat(\))operator_fat(\)) operator_fat(()ident(environ)operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(string operator_fat(()ident(cdr) ident(var)operator_fat(\))operator_fat(\))operator_fat(\)) ident(*sorted-environ-assoc*)operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*MAX-QUOTA*) integer(100)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(get-all-users)operator_fat(\)) ident(...)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(get-usage) ident(user)operator_fat(\)) ident(...)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(complain) ident(user)operator_fat(\)) ident(...)operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(user)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(disk-usage) operator_fat(()ident(get-usage) ident(user)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(>) ident(disk-usage) ident(*MAX-QUOTA*)operator_fat(\)) operator_fat(()ident(complain) ident(user)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(get-all-users)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(user)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(string=?) ident(user) stringoperator_fat(\)) operator_fat(()ident(print) ident(user)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(string-split) operator_fat(()ident(qx) stringoperator_fat(\)) char(#\\newline)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-14)operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(word)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(string-reverse) ident(word)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(string-tokenize) ident(line) ident(char-set:graphic)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; Updates vector in-place [accepts variable number of vectors]) comment(; See also the library function, 'array-map-in-order!' and its) comment(; brethren) operator_fat(()reserved(define) operator_fat(()ident(vector-map-in-order!) ident(proc) ident(vec) operator(.) ident(rest)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(all-vec) operator_fat(()reserved(cons) ident(vec) ident(rest)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(vec)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(end) operator_fat(()ident(vector-length) ident(vec)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(idx) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(idx) ident(end)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(vector-set!) ident(vec) ident(idx) operator_fat(()ident(apply) ident(proc) operator_fat(()ident(list) operator_fat(()ident(vector-ref) ident(vec) ident(idx)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(+) ident(idx) integer(1)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) ident(all-vec)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----) comment(; A non-mutating version - illustration only, as library routines) comment(; [SRFI-43 and built-ins] should be preferred) operator_fat(()reserved(define) operator_fat(()ident(vector-map-in-order) ident(proc) ident(vec) operator(.) ident(rest)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(all-vec) operator_fat(()reserved(cons) ident(vec) ident(rest)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec-len) operator_fat(()ident(reduce) ident(+) integer(0) operator_fat(()ident(map) ident(vector-length) ident(all-vec)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec) operator_fat(()ident(make-vector) ident(new-vec-len)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec-idx) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(all-vec) ident(all-vec)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(new-vec-idx) ident(new-vec-len)operator_fat(\)) ident(new-vec)operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(element)operator_fat(\)) operator_fat(()ident(vector-set!) ident(new-vec) ident(new-vec-idx) operator_fat(()ident(apply) ident(proc) operator_fat(()ident(list) ident(element)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(new-vec-idx) operator_fat(()ident(+) ident(new-vec-idx) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(car) ident(all-vec)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(cdr) ident(all-vec)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()ident(print) string ident(item)operator_fat(\))operator_fat(\)) ident(*array*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()ident(print) string ident(item)operator_fat(\))operator_fat(\)) ident(*array*)operator_fat(\)) comment(; Since a 'vector' is mutable, in-place updates allowed) operator_fat(()ident(vector-map-in-order!) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()ident(-) ident(item) integer(1)operator_fat(\))operator_fat(\)) ident(*array*)operator_fat(\)) operator_fat(()ident(print) ident(*array*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*a*) operator_fat(')operator_fat(#()integer(0.5) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*b*) operator_fat(')operator_fat(#()integer(0) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-map-in-order!) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()ident(*) ident(item) integer(7)operator_fat(\))operator_fat(\)) ident(*a*) ident(*b*)operator_fat(\)) operator_fat(()ident(print) ident(*a*) ident(*b*)operator_fat(\)) comment(;; ----------------------------) comment(; Using 'for-each' to iterate over several container items is a) comment(; simple matter of passing a list of those items e.g. a list of) comment(; strings, or of arrays etc.) comment(;) comment(; However, complications arise when:) comment(; * Heterogenous list of items e.g. list contains all of arrays,) comment(; hashes, strings, etc. Necesitates different handling based on type) comment(; * Item needs updating. It is not possible to alter the item reference) comment(; and updating an item's internals is only possible if the relevant) comment(; mutating procedures are implemented e.g. specified string characters) comment(; may be altered in-place, but character deletion requires a new be) comment(; created [i.e. altering the item reference], so is not possible) operator_fat(()reserved(define) ident(*scalar*) stringoperator_fat(\)) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*hash*) operator_fat(()ident(list) operator_fat(()reserved(cons) string stringoperator_fat(\)) operator_fat(()reserved(cons) string stringoperator_fat(\))operator_fat(\))operator_fat(\)) comment(; Illustrates iteration / handling of heterogenous types) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(string?) ident(item)operator_fat(\)) operator_fat(()ident(do-stuff-with-string) ident(item)operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(vector?) ident(item)operator_fat(\)) operator_fat(()ident(do-stuff-with-vector) ident(item)operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(pair?) ident(item)operator_fat(\)) operator_fat(()ident(do-stuff-with-hash) ident(item)operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(list) ident(*scalar*) ident(*array*) ident(*hash*)operator_fat(\))operator_fat(\)) comment(; So, for item-replacement-based updating you need to use explicit) comment(; iteration e.g. 'do' loop, or recursion [as is done in the code for) comment(; 'vector-map-in-order!'] - examples in next section. Or, you could) comment(; create a new 'for-each' type control structure using Scheme's) comment(; macro facility [example not shown]) comment(;; @@PLEAC@@_4.5) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) comment(;; ----) comment(; Whilst a 'vector' is mutable, 'array-for-each' passes only a copy) comment(; of each cell, thus there is no way to perform updates) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) ident(...) reserved(do) ident(some) ident(non-array-mutating) ident(task) ident(with) operator_fat(')ident(item)operator_fat(')ident(...)operator_fat(\)) ident(*array*)operator_fat(\)) comment(;; ------------) comment(; For mutating operations, use one of the mutating 'array-map-...' routines) comment(; or the custom, 'vector-map-in-order!') operator_fat(()ident(vector-map-in-order!) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) ident(...) reserved(do) ident(some) ident(array-mutating) ident(task) ident(with) operator_fat(')ident(item)operator_fat(')ident(...)operator_fat(\)) ident(*array*)operator_fat(\)) comment(;; ------------) comment(; Alternatively, use 'do' to iterate over the array and directly update ) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(vector-length) operator_fat(()ident(vector-length) ident(*array*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) integer(0) operator_fat(()ident(+) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(=) ident(i) ident(vector-length)operator_fat(\))operator_fat(\)) ident(...) reserved(do) ident(some) ident(array-mutating) ident(task) ident(with) ident(current) ident(array) ident(element) ident(...)operator_fat(\))operator_fat(\)) comment(;; ------------) comment(; Alternatively, use a 'named let' to iterate over array and directly update ) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(vector-length) operator_fat(()ident(vector-length) ident(*array*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(i) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(i) ident(vector-length)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(else) ident(...) reserved(do) ident(some) ident(array-mutating) ident(task) ident(with) ident(current) ident(array) ident(element) ident(...) operator_fat(()ident(loop) operator_fat(()ident(+) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*fruits*) operator_fat(')operator_fat(#()string stringoperator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(fruit)operator_fat(\)) operator_fat(()ident(print) ident(fruit) stringoperator_fat(\))operator_fat(\)) ident(*fruits*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(vector-length) operator_fat(()ident(vector-length) ident(*fruits*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) integer(0) operator_fat(()ident(+) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(=) ident(i) ident(vector-length)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(vector-ref) ident(*fruits*) ident(i)operator_fat(\)) stringoperator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*rogue-cats*) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*name-list*) operator_fat(()ident(acons) operator_fat(')ident(felines) ident(*rogue-cats*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(cat)operator_fat(\)) operator_fat(()ident(print) ident(cat) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(cdr) operator_fat(()ident(assoc) operator_fat(')ident(felines) ident(*name-list*)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(felines) operator_fat(()ident(cdr) operator_fat(()ident(assoc) operator_fat(')ident(felines) ident(*name-list*)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(null?) ident(felines)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(print) operator_fat(()ident(car) ident(felines)operator_fat(\)) stringoperator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(cdr) ident(felines)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_4.6) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) comment(; Simplest [read: least code] means of removing duplicates is to use ) comment(; SRFI-1's 'delete-duplicates' routine) operator_fat(()reserved(define) ident(*non-uniq-num-list*) operator_fat(')operator_fat(()integer(1) integer(2) integer(3) integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*uniq*) operator_fat(()ident(delete-duplicates) ident(*my-non-uniq-num-list*)operator_fat(\)) comment(;; ------------) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) comment(; Another simple alternative is to use SRFI-1's 'lset-union' routine. In) comment(; general, the 'lset-...' routines:) comment(; - convenient, but not fast; probably best avoided for 'large' sets) comment(; - operate on standard lists, so simple matter of type-converting arrays and such) comment(; - care needs to be taken in choosing the needed equality function) operator_fat(()reserved(define) ident(*non-uniq-string-list*) operator_fat(')operator_fat(()string string string string string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*uniq*) operator_fat(()ident(lset-union) ident(string=?) ident(*non-uniq-string-list*) ident(*non-uniq-string-list*)operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*non-uniq-sym-list*) operator_fat(')operator_fat(()operator_fat(')ident(a) operator_fat(')ident(b) operator_fat(')ident(c) operator_fat(')ident(a) operator_fat(')ident(b) operator_fat(')ident(c)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*uniq*) operator_fat(()ident(lset-union) ident(equal?) ident(*my-non-uniq-sym-list*) ident(*my-non-uniq-sym-list*)operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*non-uniq-num-list*) operator_fat(')operator_fat(()integer(1) integer(2) integer(3) integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*uniq*) operator_fat(()ident(lset-union) ident(=) ident(*my-non-uniq-num-list*) ident(*my-non-uniq-num-list*)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(;; Perl Cookbook-based examples - illustrative only, *not* recommended approaches) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*list*) operator_fat(')operator_fat(()integer(1) integer(2) integer(3) integer(1) integer(2) integer(7) integer(8) integer(1) integer(8) integer(2) integer(1) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*seen*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) comment(; Use hash to filter out unique items) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(assoc-ref) ident(*seen*) ident(item)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*seen*) operator_fat(()ident(assoc-set!) ident(*seen*) ident(item) pre_constant(#t)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(*list*)operator_fat(\)) comment(; Generate list of unique items) operator_fat(()reserved(define) ident(*uniq*) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(pair) ident(accum)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(car) ident(pair)operator_fat(\)) ident(accum)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) ident(*seen*)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*list*) operator_fat(')operator_fat(()integer(1) integer(2) integer(3) integer(1) integer(2) integer(7) integer(8) integer(1) integer(8) integer(2) integer(1) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*seen*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) comment(; Build list of unique items by checking set membership) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(item)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(member) ident(item) ident(*seen*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*seen*) operator_fat(()reserved(cons) ident(item) ident(*seen*)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(*list*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*users*) operator_fat(()ident(sort) operator_fat(()ident(string-split) operator_fat(()ident(qx) stringoperator_fat(\)) char(#\\newline)operator_fat(\)) ident(string operator_fat(()ident(length) ident(*union*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) string operator_fat(()ident(length) ident(*isect*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) string operator_fat(()ident(length) ident(*diff*)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_4.9) comment(; Arrays, specifically vectors in the current context, are fixed-size) comment(; entities; joining several such together requires copying of their) comment(; contents into a new, appropriately-sized, array. This task may be) comment(; performed:) comment(; * Directly: loop through existing arrays copying elements into a) comment(; newly-created array) operator_fat(()reserved(define) operator_fat(()ident(vector-join) ident(vec) operator(.) ident(rest)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(all-vec) operator_fat(()reserved(cons) ident(vec) ident(rest)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec-len) operator_fat(()ident(reduce) ident(+) integer(0) operator_fat(()ident(map) ident(vector-length) ident(all-vec)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec) operator_fat(()ident(make-vector) ident(new-vec-len)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec-idx) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(all-vec) ident(all-vec)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(new-vec-idx) ident(new-vec-len)operator_fat(\)) ident(new-vec)operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(element)operator_fat(\)) operator_fat(()ident(vector-set!) ident(new-vec) ident(new-vec-idx) ident(element)operator_fat(\)) operator_fat(()reserved(set!) ident(new-vec-idx) operator_fat(()ident(+) ident(new-vec-idx) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(car) ident(all-vec)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(cdr) ident(all-vec)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*array1*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*array2*) operator_fat(')operator_fat(#()integer(4) integer(5) integer(6)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*newarray*) operator_fat(()ident(vector-join) ident(*array1*) ident(*array2*)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; * Indirectly; convert arrays to lists, append the lists, convert) comment(; resulting list back into an array) operator_fat(()reserved(define) ident(*array1*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*array2*) operator_fat(')operator_fat(#()integer(4) integer(5) integer(6)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*newarray*) operator_fat(()ident(list->vector) operator_fat(()ident(append) operator_fat(()ident(vector->list) ident(*array1*)operator_fat(\)) operator_fat(()ident(vector->list) ident(*array2*)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(; Of course if random access is not required, it is probably best to simply) comment(; use lists since a wealth of list manipulation routines are available) comment(;; ----------------------------) comment(; While Perl offers an all-purpose 'splice' routine, a cleaner approach is) comment(; to separate out such functionality; here three routines are implemented) comment(; together offering an equivalent to 'splice'. The routines are:) comment(; * vector-replace! [use with 'vector-copy' to avoid changing original]) comment(; e.g. (vector-replace! vec ...\)) comment(; (set! new-vec (vector-replace! (vector-copy vec\) ...\)\)) comment(; * vector-delete) comment(; * vector-insert) operator_fat(()reserved(define) operator_fat(()ident(vector-replace!) ident(vec) ident(pos) ident(item) operator(.) ident(rest)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(all-items) operator_fat(()reserved(cons) ident(item) ident(rest)operator_fat(\))operator_fat(\)) operator_fat(()ident(pos) operator_fat(()reserved(if) operator_fat(()ident(<) ident(pos) integer(0)operator_fat(\)) operator_fat(()ident(+) operator_fat(()ident(vector-length) ident(vec)operator_fat(\)) ident(pos)operator_fat(\)) ident(pos)operator_fat(\))operator_fat(\)) operator_fat(()ident(in-bounds) operator_fat(()ident(not) operator_fat(()ident(>) operator_fat(()ident(+) ident(pos) operator_fat(()ident(length) ident(all-items)operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-length) ident(vec)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(in-bounds) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(i) ident(pos)operator_fat(\)) operator_fat(()ident(all-items) ident(all-items)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(null?) ident(all-items)operator_fat(\)) ident(vec)operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(vector-set!) ident(vec) ident(i) operator_fat(()ident(car) ident(all-items)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(+) ident(i) integer(1)operator_fat(\)) operator_fat(()ident(cdr) ident(all-items)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;else) ident(vec)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(vector-delete) ident(vec) ident(pos) ident(len)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(new-vec-len) operator_fat(()ident(-) operator_fat(()ident(vector-length) ident(vec)operator_fat(\)) ident(len)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec) pre_constant(#f)operator_fat(\)) operator_fat(()ident(pos) operator_fat(()reserved(if) operator_fat(()ident(<) ident(pos) integer(0)operator_fat(\)) operator_fat(()ident(+) operator_fat(()ident(vector-length) ident(vec)operator_fat(\)) ident(pos)operator_fat(\)) ident(pos)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(<) ident(new-vec-len) integer(0)operator_fat(\)) ident(vec)operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(set!) ident(new-vec) operator_fat(()ident(make-vector) ident(new-vec-len)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(vec-idx) integer(0)operator_fat(\)) operator_fat(()ident(new-vec-idx) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(new-vec-idx) ident(new-vec-len)operator_fat(\)) ident(new-vec)operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(if) operator_fat(()ident(=) ident(vec-idx) ident(pos)operator_fat(\)) operator_fat(()reserved(set!) ident(vec-idx) operator_fat(()ident(+) ident(vec-idx) ident(len)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-set!) ident(new-vec) ident(new-vec-idx) operator_fat(()ident(vector-ref) ident(vec) ident(vec-idx)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(+) ident(vec-idx) integer(1)operator_fat(\)) operator_fat(()ident(+) ident(new-vec-idx) integer(1)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(; This routine would probably benefit from having 'cmd' implemented as a keyword) comment(; argument. However, 'cmd' implemented as a positional to keep example simple) operator_fat(()reserved(define) operator_fat(()ident(vector-insert) ident(vec) ident(pos) ident(cmd) ident(item) operator(.) ident(rest)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(all-item-vec) operator_fat(()ident(list->array) integer(1) operator_fat(()reserved(cons) ident(item) ident(rest)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(all-item-vec-len) operator_fat(()ident(vector-length) ident(all-item-vec)operator_fat(\))operator_fat(\)) operator_fat(()ident(vec-len) operator_fat(()ident(vector-length) ident(vec)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec) operator_fat(()ident(make-vector) operator_fat(()ident(+) ident(vec-len) ident(all-item-vec-len)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(pos) operator_fat(()reserved(if) operator_fat(()ident(<) ident(pos) integer(0)operator_fat(\)) operator_fat(()ident(+) operator_fat(()ident(vector-length) ident(vec)operator_fat(\)) ident(pos)operator_fat(\)) ident(pos)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eq?) ident(cmd) operator_fat(')ident(after)operator_fat(\)) operator_fat(()reserved(set!) ident(pos) operator_fat(()ident(+) ident(pos) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-move-left!) ident(vec) integer(0) ident(pos) ident(new-vec) integer(0)operator_fat(\)) operator_fat(()ident(vector-move-left!) ident(all-item-vec) integer(0) ident(all-item-vec-len) ident(new-vec) ident(pos)operator_fat(\)) operator_fat(()ident(vector-move-left!) ident(vec) ident(pos) ident(vec-len) ident(new-vec) operator_fat(()ident(+) ident(pos) ident(all-item-vec-len)operator_fat(\))operator_fat(\)) ident(new-vec)operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*members*) operator_fat(')operator_fat(#()string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*initiates*) operator_fat(')operator_fat(#()string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*members*) operator_fat(()ident(vector-join) ident(*members*) ident(*initiates*)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(set!) ident(*members*) operator_fat(()ident(vector-insert) ident(*members*) integer(1) operator_fat(')ident(after) string ident(*initiates*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*members*)operator_fat(\)) operator_fat(()reserved(set!) ident(*members*) operator_fat(()ident(vector-replace) ident(*members*) integer(0) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*members*) operator_fat(()ident(vector-replace) ident(*members*) ident(-)integer(2) string stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*members*)operator_fat(\)) comment(; was: '#("Time" "Flies" "An" "Arrow"\)) comment(; now: '#("Fruit" "Flies" "Like" "A" "Banana"\)) comment(;; @@PLEAC@@_4.10) comment(; As for appending arrays, there is the choice of iterating through) comment(; the array:) operator_fat(()reserved(define) operator_fat(()ident(vector-reverse!) ident(vec)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(i) integer(0)operator_fat(\)) operator_fat(()ident(j) operator_fat(()ident(-) operator_fat(()ident(vector-length) ident(vec)operator_fat(\)) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(>=) ident(i) ident(j)operator_fat(\)) ident(vec)operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(vector-ref-swap!) ident(vec) ident(i) ident(j)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(+) ident(i) integer(1)operator_fat(\)) operator_fat(()ident(-) ident(j) integer(1)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-reverse!) ident(*array*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) operator_fat(()ident(-) operator_fat(()ident(vector-length) ident(*array*)operator_fat(\)) integer(1)operator_fat(\)) operator_fat(()ident(-) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(<) ident(i) integer(0)operator_fat(\))operator_fat(\)) ident(...) reserved(do) ident(something) ident(with) ident(*array*) ident(...)operator_fat(\)) comment(;; ----------------------------) comment(; or of converting to / from a list, performing any manipulation using) comment(; the list routines) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*newarray*) operator_fat(()ident(list->vector) operator_fat(()ident(reverse) operator_fat(()ident(sort) operator_fat(()ident(vector->list) ident(*array*)operator_fat(\)) ident(<)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_4.11) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3) integer(4) integer(5) integer(6) integer(7) integer(8)operator_fat(\))operator_fat(\)) comment(;; ------------) comment(; Remove first 3 elements) operator_fat(()reserved(define) ident(*front*) operator_fat(()ident(vector-delete) ident(*array*) integer(0) integer(3)operator_fat(\))operator_fat(\)) comment(; Remove last 3 elements) operator_fat(()reserved(define) ident(*end*) operator_fat(()ident(vector-delete) ident(*array*) ident(-)integer(1) integer(3)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; Another helper routine) operator_fat(()reserved(define) operator_fat(()ident(vector-slice) ident(vec) ident(pos) ident(len)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(vec-len) operator_fat(()ident(vector-length) ident(vec)operator_fat(\))operator_fat(\)) operator_fat(()ident(pos) operator_fat(()reserved(if) operator_fat(()ident(<) ident(pos) integer(0)operator_fat(\)) operator_fat(()ident(+) ident(vec-len) ident(pos)operator_fat(\)) ident(pos)operator_fat(\))operator_fat(\)) operator_fat(()ident(in-bounds) operator_fat(()ident(not) operator_fat(()ident(>) operator_fat(()ident(+) ident(pos) ident(len)operator_fat(\)) ident(vec-len)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(in-bounds) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(new-vec) operator_fat(()ident(make-vector) ident(len)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(vec-idx) ident(pos)operator_fat(\)) operator_fat(()ident(new-vec-idx) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(new-vec-idx) ident(len)operator_fat(\)) ident(new-vec)operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(vector-set!) ident(new-vec) ident(new-vec-idx) operator_fat(()ident(vector-ref) ident(vec) ident(vec-idx)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(+) ident(vec-idx) integer(1)operator_fat(\)) operator_fat(()ident(+) ident(new-vec-idx) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) comment(;else) ident(vec)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Both the following use, 'values', to return two values; this approach) comment(; is quite contrived and is taken to mimic the Perl examples, not) comment(; because it is a recommended one [returning a single list would probably) comment(; be more sensible]) operator_fat(()reserved(define) operator_fat(()ident(shift2) ident(vec)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(vec) operator_fat(()ident(vector-slice) ident(vec) integer(0) integer(2)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(values) operator_fat(()ident(vector-ref) ident(vec) integer(0)operator_fat(\)) operator_fat(()ident(vector-ref) ident(vec) integer(1)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(pop2) ident(vec)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(vec) operator_fat(()ident(vector-slice) ident(vec) ident(-)integer(1) integer(2)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(values) operator_fat(()ident(vector-ref) ident(vec) integer(0)operator_fat(\)) operator_fat(()ident(vector-ref) ident(vec) integer(1)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*friends*) operator_fat(')operator_fat(#()operator_fat(')ident(Peter) operator_fat(')ident(Paul) operator_fat(')ident(Mary) operator_fat(')ident(Jim) operator_fat(')ident(Tim)operator_fat(\))operator_fat(\)) operator_fat(()ident(let-values) operator_fat(() operator_fat(()operator_fat(()ident(this) ident(that)operator_fat(\)) operator_fat(()ident(shift2) ident(*friends*)operator_fat(\))operator_fat(\)) operator_fat(\)) operator_fat(()ident(print) ident(this) string ident(that)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*beverages*) operator_fat(')operator_fat(#()operator_fat(')ident(Dew) operator_fat(')ident(Jolt) operator_fat(')ident(Cola) operator_fat(')ident(Sprite) operator_fat(')ident(Fresca)operator_fat(\))operator_fat(\)) operator_fat(()ident(let-values) operator_fat(() operator_fat(()operator_fat(()ident(d1) ident(d2)operator_fat(\)) operator_fat(()ident(pop2) ident(*beverages*)operator_fat(\))operator_fat(\)) operator_fat(\)) operator_fat(()ident(print) ident(d1) string ident(d2)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_4.12) comment(; SRFI-1 [list manipulation] routines are ideal for the types of task) comment(; in this and the next section, in particular, 'for-each' and 'find',) comment(; 'list-index', and many others for more specialist functions. The same) comment(; applies to vectors with the SRFI-43 routines, 'vector-index' and) comment(; 'vector-skip', though the approach taken in this chapter has been to) comment(; implement functionally similar vector manipulation routines to more) comment(; closely mimic the Perl examples) comment(; Return #f, or first index for which 'pred' returns true) operator_fat(()reserved(define) operator_fat(()ident(vector-first-idx) ident(pred) ident(vec)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(vec-len) operator_fat(()ident(vector-length) ident(vec)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(idx) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(idx) ident(vec-len)operator_fat(\)) pre_constant(#f)operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(if) operator_fat(()ident(pred) operator_fat(()ident(vector-ref) ident(vec) ident(idx)operator_fat(\))operator_fat(\)) ident(idx) comment(;else) operator_fat(()ident(loop) operator_fat(()ident(+) ident(idx) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Return #f, or first index for which 'pred' returns true) operator_fat(()reserved(define) operator_fat(()ident(list-first-idx) ident(pred) ident(list)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(idx) integer(0)operator_fat(\)) operator_fat(()ident(list) ident(list)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(null?) ident(list)operator_fat(\)) pre_constant(#f)operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(if) operator_fat(()ident(pred) operator_fat(()ident(car) ident(list)operator_fat(\))operator_fat(\)) ident(idx) comment(;else) operator_fat(()ident(loop) operator_fat(()ident(+) ident(idx) integer(1)operator_fat(\)) operator_fat(()ident(cdr) ident(list)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*array*) operator_fat(')operator_fat(#()integer(1) integer(2) integer(3) integer(4) integer(5) integer(6) integer(7) integer(8)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(vector-first-idx) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(=) ident(x) integer(9)operator_fat(\))operator_fat(\)) ident(*array*)operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*list*) operator_fat(')operator_fat(()integer(1) integer(2) integer(3) integer(4) integer(5) integer(6) integer(7) integer(8)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(list-first-idx) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(=) ident(x) integer(4)operator_fat(\))operator_fat(\)) ident(*list*)operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(list-index) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(=) ident(x) integer(4)operator_fat(\))operator_fat(\)) ident(*list*)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; The Perl 'highest paid engineer' example isn't really a 'first match') comment(; type of problem - the routines shown earlier really aren't suited to) comment(; this. Better suited, instead, are the SRFI-1 routines like 'fold',) comment(; 'fold-right' and 'reduce', even old standbys like 'filter' and 'for-each') operator_fat(()reserved(define) ident(+)ident(null-salary-rec+) operator_fat(()ident(list) operator_fat(')operator_fat(()operator_fat(\)) integer(0) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*salaries*) operator_fat(()ident(list) operator_fat(()ident(list) operator_fat(')ident(engineer) integer(43000) operator_fat(')ident(Bob)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(programmer) integer(48000) operator_fat(')ident(Andy)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(engineer) integer(35000) operator_fat(')ident(Champ)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(engineer) integer(49000) operator_fat(')ident(Bubbles)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(programmer) integer(47000) operator_fat(')ident(Twig)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(engineer) integer(34000) operator_fat(')ident(Axel)operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*highest-paid-engineer*) operator_fat(()ident(reduce) operator_fat(()reserved(lambda) operator_fat(()ident(salary-rec) ident(acc)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()reserved(and) operator_fat(()ident(eq?) operator_fat(()ident(car) ident(salary-rec)operator_fat(\)) operator_fat(')ident(engineer)operator_fat(\)) operator_fat(()ident(>) operator_fat(()ident(cadr) ident(salary-rec)operator_fat(\)) operator_fat(()ident(cadr) ident(acc)operator_fat(\))operator_fat(\))operator_fat(\)) ident(salary-rec) comment(;else) ident(acc)operator_fat(\))operator_fat(\)) ident(+)ident(null-salary-rec+) ident(*salaries*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*highest-paid-engineer*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*highest-paid-engineer*) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(salary-rec) ident(acc)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(>) operator_fat(()ident(cadr) ident(salary-rec)operator_fat(\)) operator_fat(()ident(cadr) ident(acc)operator_fat(\))operator_fat(\)) ident(salary-rec) comment(;else) ident(acc)operator_fat(\))operator_fat(\)) ident(+)ident(null-salary-rec+) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(salary-rec)operator_fat(\)) operator_fat(()ident(eq?) operator_fat(()ident(car) ident(salary-rec)operator_fat(\)) operator_fat(')ident(engineer)operator_fat(\))operator_fat(\)) ident(*salaries*)operator_fat(\))operator_fat(\)) operator_fat(\)) operator_fat(()ident(print) ident(*highest-paid-engineer*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*highest-paid-engineer*) ident(+)ident(null-salary-rec+)operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(salary-rec)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()reserved(and) operator_fat(()ident(eq?) operator_fat(()ident(car) ident(salary-rec)operator_fat(\)) operator_fat(')ident(engineer)operator_fat(\)) operator_fat(()ident(>) operator_fat(()ident(cadr) ident(salary-rec)operator_fat(\)) operator_fat(()ident(cadr) ident(*highest-paid-engineer*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*highest-paid-engineer*) ident(salary-rec)operator_fat(\))operator_fat(\))operator_fat(\)) ident(*salaries*)operator_fat(\)) operator_fat(()ident(print) ident(*highest-paid-engineer*)operator_fat(\)) comment(;; @@PLEAC@@_4.13) comment(; All tasks in this section consist of either generating a collection,) comment(; or filtering a larger collection, of elements matching some criteria;) comment(; obvious candidates are the 'filter' and 'array-filter' routines, though) comment(; others like 'for-each' can also be applied) operator_fat(()reserved(define) ident(*list-matching*) operator_fat(()ident(filter) ident(PRED) ident(LIST)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*vector-matching*) operator_fat(()ident(array-filter) ident(PRED) ident(ARRAY)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*nums*) operator_fat(')operator_fat(()integer(1e7) integer(3e7) integer(2e7) integer(4e7) integer(1e7) integer(3e7) integer(2e7) integer(4e7)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*bigs*) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(num)operator_fat(\)) operator_fat(()ident(>) ident(num) integer(1000000)operator_fat(\))operator_fat(\)) ident(*nums*)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*users*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(u1) operator(.) integer(2e7)operator_fat(\)) operator_fat(')operator_fat(()ident(u2) operator(.) integer(1e7)operator_fat(\)) operator_fat(')operator_fat(()ident(u3) operator(.) integer(4e7)operator_fat(\)) operator_fat(')operator_fat(()ident(u4) operator(.) integer(3e7)operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*pigs*) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(pair) ident(accum)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(car) ident(pair)operator_fat(\)) ident(accum)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()ident(>) operator_fat(()ident(cdr) ident(pair)operator_fat(\)) integer(1e7)operator_fat(\))operator_fat(\)) ident(*users*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*pigs*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*salaries*) operator_fat(()ident(list) operator_fat(()ident(list) operator_fat(')ident(engineer) integer(43000) operator_fat(')ident(Bob)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(programmer) integer(48000) operator_fat(')ident(Andy)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(engineer) integer(35000) operator_fat(')ident(Champ)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(engineer) integer(49000) operator_fat(')ident(Bubbles)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(programmer) integer(47000) operator_fat(')ident(Twig)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(engineer) integer(34000) operator_fat(')ident(Axel)operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*engineers*) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(salary-rec)operator_fat(\)) operator_fat(()ident(eq?) operator_fat(()ident(car) ident(salary-rec)operator_fat(\)) operator_fat(')ident(engineer)operator_fat(\))operator_fat(\)) ident(*salaries*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*engineers*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*applicants*) operator_fat(()ident(list) operator_fat(()ident(list) operator_fat(')ident(a1) integer(26000) operator_fat(')ident(Bob)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(a2) integer(28000) operator_fat(')ident(Andy)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(a3) integer(24000) operator_fat(')ident(Candy)operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*secondary-assistance*) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(salary-rec)operator_fat(\)) operator_fat(()reserved(and) operator_fat(()ident(>) operator_fat(()ident(cadr) ident(salary-rec)operator_fat(\)) integer(26000)operator_fat(\)) operator_fat(()ident(<) operator_fat(()ident(cadr) ident(salary-rec)operator_fat(\)) integer(30000)operator_fat(\))operator_fat(\))operator_fat(\)) ident(*applicants*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*secondary-assistance*)operator_fat(\)) comment(;; @@PLEAC@@_4.14) comment(; Sorting numeric data in Scheme is very straightforward ...) operator_fat(()reserved(define) ident(*unsorted*) operator_fat(')operator_fat(()integer(5) integer(8) integer(1) integer(7) integer(4) integer(2) integer(3) integer(6)operator_fat(\))operator_fat(\)) comment(;; ------------) comment(; Ascending sort - use '<' as comparator) operator_fat(()reserved(define) ident(*sorted*) operator_fat(()ident(sort) ident(*unsorted*) ident(<)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*sorted*)operator_fat(\)) comment(;; ------------) comment(; Descending sort - use '>' as comparator) operator_fat(()reserved(define) ident(*sorted*) operator_fat(()ident(sort) ident(*unsorted*) ident(>)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*sorted*)operator_fat(\)) comment(;; @@PLEAC@@_4.15) comment(; A customised lambda may be passed as comparator to 'sort', so) comment(; sorting on one or more 'fields' is quite straightforward) operator_fat(()reserved(define) ident(*unordered*) operator_fat(')operator_fat(() ident(...) operator_fat(\))operator_fat(\)) comment(; COMPARE is some comparator suited for the element type being) comment(; sorted) operator_fat(()reserved(define) ident(*ordered*) operator_fat(()ident(sort) ident(*unordered*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(COMPARE) ident(left) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*unordered*) operator_fat(()ident(list) operator_fat(()reserved(cons) operator_fat(')ident(s) integer(34)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(')ident(e) integer(12)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(')ident(c) integer(45)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(')ident(q) integer(11)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(')ident(g) integer(24)operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*pre-computed*) operator_fat(()ident(map) comment(; Here element is returned unaltered, but it would normally be) comment(; transformed in som way) operator_fat(()reserved(lambda) operator_fat(()ident(element)operator_fat(\)) ident(element)operator_fat(\)) ident(*unordered*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*ordered-pre-computed*) operator_fat(()ident(sort) ident(*pre-computed*) comment(; Sort on the first field [assume it is the 'key'] ) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) operator_fat(()ident(car) ident(left)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Extract the second field [assume it is the 'value']) operator_fat(()reserved(define) ident(*ordered*) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(element)operator_fat(\)) operator_fat(()ident(cdr) ident(element)operator_fat(\))operator_fat(\)) ident(*ordered-pre-computed*)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*employees*) operator_fat(()ident(list) operator_fat(()ident(list) operator_fat(')ident(Bob) integer(43000) integer(123) integer(42)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(Andy) integer(48000) integer(124) integer(35)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(Champ) integer(35000) integer(125) integer(37)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(Bubbles) integer(49000) integer(126) integer(34)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(Twig) integer(47000) integer(127) integer(36)operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(Axel) integer(34000) integer(128) integer(31)operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*ordered*) operator_fat(()ident(sort) ident(*employees*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) operator_fat(()ident(car) ident(left)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(employee)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(car) ident(employee)operator_fat(\)) string operator_fat(()ident(cadr) ident(employee)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(sort) ident(*employees*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) operator_fat(()ident(car) ident(left)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*bonus*) operator_fat(()ident(list) operator_fat(')operator_fat(()integer(125) operator(.) integer(1000)operator_fat(\)) operator_fat(')operator_fat(()integer(127) operator(.) integer(1500)operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(employee)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(bonus) operator_fat(()ident(assoc-ref) ident(*bonus*) operator_fat(()ident(caddr) ident(employee)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) ident(bonus)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) comment(;else) operator_fat(()ident(print) operator_fat(()ident(car) ident(employee)operator_fat(\)) string ident(bonus)operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(sort) ident(*employees*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) operator_fat(()ident(car) ident(left)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\)) operator_fat(()ident(ice-9) ident(rdelim)operator_fat(\)) operator_fat(()ident(ice-9) ident(regex)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*filename*) stringoperator_fat(\)) operator_fat(()reserved(define) ident(*users*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(port) operator_fat(()ident(open-input-file) ident(*filename*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line&terminator) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(split)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(eof-object?) operator_fat(()ident(cdr) ident(line&terminator)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(set!) ident(*users*) operator_fat(()ident(assoc-set!) ident(*users*) operator_fat(()ident(car) operator_fat(()ident(string-split) operator_fat(()ident(car) ident(line&terminator)operator_fat(\)) char(#\\:)operator_fat(\))operator_fat(\)) pre_constant(#t)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(split)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close-input-port) ident(port)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(user)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(car) ident(user)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(sort) ident(*users*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(string operator_fat(()ident(car) ident(processes)operator_fat(\))operator_fat(\)) operator_fat(()ident(sleep) integer(1)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(cdr) ident(processes)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_4.17) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) comment(; Implements Fischer-Yates shuffle algorithm) operator_fat(()reserved(define) operator_fat(()ident(vector-shuffle!) ident(vec)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(vector-length) operator_fat(()ident(vector-length) ident(vec)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(i) ident(vector-length)operator_fat(\)) operator_fat(()ident(j) operator_fat(()ident(+) integer(1) operator_fat(()ident(random) ident(vector-length)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(i) integer(1)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(=) ident(i) ident(j)operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-ref-swap!) ident(vec) operator_fat(()ident(-) ident(i) integer(1)operator_fat(\)) operator_fat(()ident(-) ident(j) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(-) ident(i) integer(1)operator_fat(\)) operator_fat(()ident(+) integer(1) operator_fat(()ident(random) operator_fat(()ident(-) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(loop) operator_fat(()ident(-) ident(i) integer(1)operator_fat(\)) operator_fat(()ident(+) integer(1) operator_fat(()ident(random) operator_fat(()ident(-) ident(i) integer(1)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(vector-ref-swap!) ident(vec) ident(idx1) ident(idx2)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(tmp) operator_fat(()ident(vector-ref) ident(vec) ident(idx1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-set!) ident(vec) ident(idx1) operator_fat(()ident(vector-ref) ident(vec) ident(idx2)operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-set!) ident(vec) ident(idx2) ident(tmp)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Generate vector of values 1 .. 10) operator_fat(()reserved(define) ident(*irange*) operator_fat(()ident(list->vector) operator_fat(()ident(iota) integer(10) integer(1) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Shuffle array values) operator_fat(()ident(vector-shuffle!) ident(*irange*)operator_fat(\)) comment(;; @@PLEAC@@_4.18) comment(;; @@INCOMPLETE@@) comment(;; @@INCOMPLETE@@) comment(;; @@PLEAC@@_4.19) comment(;; @@INCOMPLETE@@) comment(;; @@INCOMPLETE@@) comment(;; @@PLEAC@@_5.0) comment(;; ---------------------------------------------------------------------) comment(;; Scheme offers two dictionary types:) comment(;;) comment(;; * Association list [list of pairs e.g. '((k1 . v1\) (k2 . v2\) ...\)]) comment(;; * Hash table [vector of pairs plus hash algorithm]) comment(;;) comment(;; Implementation differences aside, they are remarkably similar in that) comment(;; the functions operating on them are similar named, and offer the same) comment(;; interface. Examples:) comment(;;) comment(;; * Retrieve an item: (assoc-ref hash key\) (hash-ref hash key\)) comment(;; * Update an item: (assoc-set! hash key value\) (hash-set! hash key value\) ) comment(;;) comment(;; Hash tables would tend to be used where performance was critical e.g.) comment(;; near constant-time lookups, or where entry updates are frequent, whilst) comment(;; association lists would be used where table-level traversals and ) comment(;; manipulations require maximum flexibility) comment(;;) comment(;; Many of the sections include examples using both association lists and) comment(;; hash tables. However, where only one of these is shown, implementing) comment(;; the other is usually a trivial exercise. Finally, any helper functions) comment(;; will be included in the Appendix) comment(;; ---------------------------------------------------------------------) comment(; Association lists) operator_fat(()reserved(define) ident(*age*) operator_fat(()ident(list) operator_fat(()reserved(cons) operator_fat(')ident(Nat) integer(24)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(')ident(Jules) integer(25)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(')ident(Josh) integer(17)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or, perhaps more compactly:) operator_fat(()reserved(define) ident(*age*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Nat) operator(.) integer(24)operator_fat(\)) operator_fat(')operator_fat(()ident(Jules) operator(.) integer(25)operator_fat(\)) operator_fat(')operator_fat(()ident(Josh) operator(.) integer(17)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) comment(; Guile built-in association list support) operator_fat(()reserved(define) ident(*age*) operator_fat(()ident(acons) operator_fat(')ident(Nat) integer(24) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*age*) operator_fat(()ident(acons) operator_fat(')ident(Jules) integer(25) ident(*age*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*age*) operator_fat(()ident(acons) operator_fat(')ident(Josh) integer(17) ident(*age*)operator_fat(\))operator_fat(\)) comment(;; ----) comment(; SRFI-1 association list support) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*age*) operator_fat(()ident(alist-cons) operator_fat(')ident(Nat) integer(24) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*age*) operator_fat(()ident(alist-cons) operator_fat(')ident(Jules) integer(25) ident(*age*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*age*) operator_fat(()ident(alist-cons) operator_fat(')ident(Josh) integer(17) ident(*age*)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*food-colour*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Apple) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Banana) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Lemon) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Carrot) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; Hash tables. Guile offers an implementation, and it is also ) comment(; possible to use SRFI-69 hash tables; only the former will be) comment(; illustrated here) operator_fat(()reserved(define) ident(*age*) operator_fat(()ident(make-hash-table) integer(20)operator_fat(\))operator_fat(\)) comment(; or) operator_fat(()reserved(define) ident(*age*) operator_fat(()ident(make-vector) integer(20) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(hash-set!) ident(*age*) operator_fat(')ident(Nat) integer(24)operator_fat(\)) operator_fat(()ident(hash-set!) ident(*age*) operator_fat(')ident(Jules) integer(25)operator_fat(\)) operator_fat(()ident(hash-set!) ident(*age*) operator_fat(')ident(Josh) integer(17)operator_fat(\)) operator_fat(()ident(hash-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(key) ident(value)operator_fat(\)) operator_fat(()ident(print) ident(key)operator_fat(\))operator_fat(\)) ident(*age*)operator_fat(\)) comment(; or, if vector used as hash table, can also use:) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(null?) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(*age*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*food-colour*) operator_fat(()ident(make-hash-table) integer(20)operator_fat(\))operator_fat(\)) operator_fat(()ident(hash-set!) ident(*food-colour*) operator_fat(')ident(Apple) stringoperator_fat(\)) operator_fat(()ident(hash-set!) ident(*food-colour*) operator_fat(')ident(Banana) stringoperator_fat(\)) operator_fat(()ident(hash-set!) ident(*food-colour*) operator_fat(')ident(Lemon) stringoperator_fat(\)) operator_fat(()ident(hash-set!) ident(*food-colour*) operator_fat(')ident(Carrot) stringoperator_fat(\)) comment(;; @@PLEAC@@_5.1) operator_fat(()reserved(set!) ident(*hash*) operator_fat(()ident(acons) ident(key) ident(value) ident(*hash*)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(set!) ident(*food-colour*) operator_fat(()ident(acons) operator_fat(')ident(Raspberry) string ident(*food-colour*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) ident(*food-colour*)operator_fat(\)) comment(;; ----------------------------) operator_fat(()ident(hash-set!) ident(*hash*) ident(key) ident(value)operator_fat(\)) comment(;; ------------) operator_fat(()ident(hash-set!) ident(*food-colour*) operator_fat(')ident(Raspberry) stringoperator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(hash-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(key) ident(value)operator_fat(\)) operator_fat(()ident(print) ident(key)operator_fat(\))operator_fat(\)) ident(*food-colour*)operator_fat(\)) comment(;; @@PLEAC@@_5.2) comment(; 'assoc' returns the pair, (key . value\)) operator_fat(()reserved(if) operator_fat(()ident(assoc) ident(key) ident(hash)operator_fat(\)) ident(...) ident(found) ident(...) comment(;else) ident(...) ident(not) ident(found) ident(...) comment(; 'assoc-ref' returns the value only) operator_fat(()reserved(if) operator_fat(()ident(assoc-ref) ident(hash) ident(key)operator_fat(\)) ident(...) ident(found) ident(...) comment(;else) ident(...) ident(not) ident(found) ident(...) comment(;; ------------) comment(; *food-colour* association list from an earlier section) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(name)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(pair) operator_fat(()ident(assoc) ident(name) ident(*food-colour*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(pair) operator_fat(()ident(print) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) stringoperator_fat(\)) comment(;else) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(name)operator_fat(\)) stringoperator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(Banana) operator_fat(')ident(Martini)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; 'hash-get-handle' returns the pair, (key . value\)) operator_fat(()reserved(if) operator_fat(()ident(hash-get-handle) ident(hash) ident(key)operator_fat(\)) ident(...) ident(found) ident(...) comment(;else) ident(...) ident(not) ident(found) ident(...) comment(; 'hash-ref' returns the value only) operator_fat(()reserved(if) operator_fat(()ident(hash-ref) ident(hash) ident(key)operator_fat(\)) ident(...) ident(found) ident(...) comment(;else) ident(...) ident(not) ident(found) ident(...) comment(;; ------------) comment(; *food-colour* hash table from an earlier section) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(name)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(value) operator_fat(()ident(hash-ref) ident(*food-colour*) ident(name)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(value) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(name)operator_fat(\)) stringoperator_fat(\)) comment(;else) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(name)operator_fat(\)) stringoperator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(Banana) operator_fat(')ident(Martini)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*age*) operator_fat(()ident(make-hash-table) integer(20)operator_fat(\))operator_fat(\)) operator_fat(()ident(hash-set!) ident(*age*) operator_fat(')ident(Toddler) integer(3)operator_fat(\)) operator_fat(()ident(hash-set!) ident(*age*) operator_fat(')ident(Unborn) integer(0)operator_fat(\)) operator_fat(()ident(hash-set!) ident(*age*) operator_fat(')ident(Phantasm) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(thing)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(value) operator_fat(()ident(hash-ref) ident(*age*) ident(thing)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) ident(thing)operator_fat(\)) operator_fat(()reserved(if) ident(value) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()reserved(and) ident(value) operator_fat(()ident(not) operator_fat(()ident(string-null?) ident(value)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) comment(; Testing for non-zero as true is not applicable, so testing) comment(; for non-equality with zero ) operator_fat(()reserved(if) operator_fat(()reserved(and) ident(value) operator_fat(()ident(not) operator_fat(()ident(eq?) ident(value) integer(0)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()ident(list) operator_fat(')ident(Toddler) operator_fat(')ident(Unborn) operator_fat(')ident(Phantasm) operator_fat(')ident(Relic)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_5.3) operator_fat(()ident(assoc-remove!) ident(hash) ident(key)operator_fat(\)) comment(;; ------------) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) comment(; *food-colour* association list from an earlier section) operator_fat(()reserved(define) operator_fat(()ident(print-foods)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(foods) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(pair) ident(accum)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(car) ident(pair)operator_fat(\)) ident(accum)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) ident(*food-colour*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()ident(print) ident(foods)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(food)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(colour) operator_fat(()ident(assoc-ref) ident(*food-colour*) ident(food)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(string-null?) ident(colour)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(display) operator_fat(()ident(string-append) ident(colour) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) ident(foods)operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(print-foods)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(assoc-set!) ident(*food-colour*) operator_fat(')ident(Banana) stringoperator_fat(\)) operator_fat(()ident(print-foods)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(assoc-remove!) ident(*food-colour*) operator_fat(')ident(Banana)operator_fat(\)) operator_fat(()ident(print-foods)operator_fat(\)) comment(;; ----------------------------) operator_fat(()ident(hash-remove!) ident(hash) ident(key)operator_fat(\)) comment(;; ------------) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\))operator_fat(\)) comment(; *food-colour* hash table from an earlier section) operator_fat(()reserved(define) operator_fat(()ident(print-foods)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(foods) operator_fat(()ident(hash-fold) operator_fat(()reserved(lambda) operator_fat(()ident(key) ident(value) ident(accum)operator_fat(\)) operator_fat(()reserved(cons) ident(key) ident(accum)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) ident(*food-colour*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(reverse) ident(foods)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(food)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(colour) operator_fat(()ident(hash-ref) ident(*food-colour*) ident(food)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(string-null?) ident(colour)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(display) operator_fat(()ident(string-append) ident(colour) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) ident(foods)operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(print-foods)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(hash-set!) ident(*food-colour*) operator_fat(')ident(Banana) stringoperator_fat(\)) operator_fat(()ident(print-foods)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(hash-remove!) ident(*food-colour*) operator_fat(')ident(Banana)operator_fat(\)) operator_fat(()ident(print-foods)operator_fat(\)) comment(;; @@PLEAC@@_5.4) comment(; Since an association list is nothing more than a list of pairs, it) comment(; may be traversed using 'for-each') operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(key) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(value) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) ident(...) reserved(do) ident(something) ident(with) ident(key) ident(/) ident(value) ident(...)operator_fat(\))operator_fat(\)) ident(hash)operator_fat(\)) comment(;; ----------------------------) comment(; A 'for-each'-like function is available for hash table traversal) operator_fat(()ident(hash-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(key) ident(value)operator_fat(\)) ident(...) reserved(do) ident(something) ident(with) ident(key) ident(/) ident(value) ident(...)operator_fat(\)) ident(hash)operator_fat(\)) comment(; If the hash table is directly implemented as a vector, then it is) comment(; also possible to traverse it using, 'array-for-each', though a ) comment(; check for empty slots is needed ) operator_fat(()ident(array-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(null?) ident(pair)operator_fat(\))operator_fat(\)) ident(...) reserved(do) ident(something) ident(with) ident(key) ident(/) ident(value) ident(...)operator_fat(\))operator_fat(\)) ident(hash)operator_fat(\)) comment(;; ----------------------------) comment(; *food-colour* association list from an earlier section) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(food) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(colour) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(food)operator_fat(\)) string ident(colour)operator_fat(\)) operator_fat(\))operator_fat(\)) ident(*food-colour*)operator_fat(\)) comment(;; ------------) comment(; *food-colour* association list from an earlier section) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(food)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(food)operator_fat(\)) string operator_fat(()ident(assoc-ref) ident(*food-colour*) ident(food)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(sort) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(pair) ident(accum)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(car) ident(pair)operator_fat(\)) ident(accum)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) ident(*food-colour*)operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) ident(left)operator_fat(\)) operator_fat(()ident(symbol->string) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\)) operator_fat(()ident(ice-9) ident(rdelim)operator_fat(\)) operator_fat(()ident(ice-9) ident(regex)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*filename*) stringoperator_fat(\)) operator_fat(()reserved(define) ident(*from*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(port) operator_fat(()ident(open-input-file) ident(*filename*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line&terminator) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(split)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(eof-object?) operator_fat(()ident(cdr) ident(line&terminator)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(key) operator_fat(()ident(string->symbol) operator_fat(()ident(match:substring) operator_fat(()ident(string-match) string operator_fat(()ident(car) ident(line&terminator)operator_fat(\))operator_fat(\)) integer(1)operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()ident(value) operator_fat(()ident(assoc-ref) ident(*from*) ident(key)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) ident(value)operator_fat(\)) operator_fat(()reserved(set!) ident(value) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*from*) operator_fat(()ident(assoc-set!) ident(*from*) ident(key) operator_fat(()ident(+) integer(1) ident(value)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(split)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close-input-port) ident(port)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(person)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(person)operator_fat(\)) string operator_fat(()ident(number->string) operator_fat(()ident(assoc-ref) ident(*from*) ident(person)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(sort) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(pair) ident(accum)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(car) ident(pair)operator_fat(\)) ident(accum)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) ident(*from*)operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) ident(left)operator_fat(\)) operator_fat(()ident(symbol->string) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_5.5) comment(; All approaches shown in the previous section apply here also, so) comment(; there is little to be gained by repeating those examples [i.e. the) comment(; use of 'for-each' and similar]. It is always possible, of course,) comment(; to directly recurse over an association list:) comment(; *food-colour* association list from an earlier section) operator_fat(()reserved(define) ident(*sorted-food-colour*) operator_fat(()ident(sort) ident(*food-colour*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) operator_fat(()ident(car) ident(left)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(hash) ident(*sorted-food-colour*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(null?) ident(hash)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(print) operator_fat(()ident(symbol->string) operator_fat(()ident(car) operator_fat(()ident(car) ident(hash)operator_fat(\))operator_fat(\))operator_fat(\)) string)delimiter(")> operator_fat(()ident(cdr) operator_fat(()ident(car) ident(hash)operator_fat(\))operator_fat(\)) operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(cdr) ident(hash)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_5.6) comment(; AFAIK, Scheme doesn't offer a facility similar to Perl's 'Tie::IxHash'.) comment(; Therefore, use an association list if retrieval [from a dictionary) comment(; type container] in insertion order is required.) operator_fat(()reserved(define) ident(*food-colour*) operator_fat(()ident(acons) operator_fat(')ident(Banana) string operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*food-colour*) operator_fat(()ident(acons) operator_fat(')ident(Apple) string ident(*food-colour*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*food-colour*) operator_fat(()ident(acons) operator_fat(')ident(Lemon) string ident(*food-colour*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(food) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(colour) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(print) string operator_fat(()ident(symbol->string) ident(food)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) ident(*food-colour*)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(food) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(colour) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(food)operator_fat(\)) string ident(colour)operator_fat(\)) operator_fat(\))operator_fat(\)) ident(*food-colour*)operator_fat(\)) comment(;; ----------------------------) comment(; Of course, insertion order is lost if the association list is sorted,) comment(; or elements removed, so if maintaining insertion order is vital, it) comment(; might pay to associate data with a timestamp [e.g. create a timestamped) comment(; record / structure], and manipulate those entities [no example given]) comment(;; @@PLEAC@@_5.7) operator_fat(()reserved(define) ident(*ttys*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(user-tty-pair)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(user-tty-pair) operator_fat(()ident(string-split) ident(user-tty-pair) char(#\\space)operator_fat(\))operator_fat(\)) operator_fat(()ident(user) operator_fat(()ident(string->symbol) operator_fat(()ident(car) ident(user-tty-pair)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(newtty) operator_fat(()ident(cadr) ident(user-tty-pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(current-ttys) operator_fat(()ident(assoc-ref) ident(*ttys*) ident(user)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*ttys*) operator_fat(()ident(assoc-set!) ident(*ttys*) ident(user) operator_fat(()reserved(if) operator_fat(()ident(not) ident(current-ttys)operator_fat(\)) ident(newtty) operator_fat(()ident(string-append) ident(current-ttys) string ident(newtty)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(string-split) operator_fat(()ident(qx) stringoperator_fat(\)) char(#\\newline)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(user-ttys)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(user-ttys)operator_fat(\))operator_fat(\)) string operator_fat(()ident(cdr) ident(user-ttys)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(sort) ident(*ttys*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) operator_fat(()ident(car) ident(left)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\)) comment(;; ----------------------------) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(regex)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(multi-hash-delete) ident(hash) ident(key) ident(value)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(value-found) operator_fat(()ident(assoc-ref) ident(hash) ident(key)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(value-found) operator_fat(()ident(assoc-ref) ident(hash) ident(key) operator_fat(()ident(regexp-substitute/global) pre_constant(#f) operator_fat(()ident(string-match) ident(value) ident(value-found)operator_fat(\)) operator_fat(')ident(pre) string operator_fat(')ident(post) stringoperator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_5.8) comment(; Alternate implementatons of a hash inversion function; both assume) comment(; key is a symbol, value is a string) operator_fat(()reserved(define) operator_fat(()ident(assoc-invert) ident(assoc)operator_fat(\)) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(string->symbol) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(assoc)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) operator_fat(()ident(assoc-invert) ident(assoc)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(assoc) ident(assoc)operator_fat(\)) operator_fat(()ident(new-assoc) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(null?) ident(assoc)operator_fat(\)) ident(new-assoc)operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(loop) operator_fat(()ident(cdr) ident(assoc)operator_fat(\)) operator_fat(()ident(acons) operator_fat(()ident(string->symbol) operator_fat(()ident(cdar) ident(assoc)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(caar) ident(assoc)operator_fat(\))operator_fat(\)) ident(new-assoc)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*surname*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Mickey) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Babe) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*first-name*) operator_fat(()ident(assoc-invert) ident(*surname*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(assoc-ref) ident(*first-name*) operator_fat(')ident(Mantle)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; foodfind) operator_fat(()reserved(define) ident(*given*) operator_fat(()ident(string->symbol) operator_fat(()ident(cadr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*colour*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Apple) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Lemon) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Carrot) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*food*) operator_fat(()ident(assoc-invert) ident(*colour*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(assoc-ref) ident(*colour*) ident(*given*)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(*given*)operator_fat(\)) string operator_fat(()ident(assoc-ref) ident(*colour*) ident(*given*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(assoc-ref) ident(*food*) ident(*given*)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(assoc-ref) ident(*food*) ident(*given*)operator_fat(\)) string operator_fat(()ident(symbol->string) ident(*given*)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_5.9) comment(; *food-colour* association list from an earlier section) comment(; Use 'sort' to sort the entire hash, on key or on value, ascending or) comment(; descending order) operator_fat(()reserved(define) ident(*sorted-on-key:food-colour*) operator_fat(()ident(sort) ident(*food-colour*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) operator_fat(()ident(car) ident(left)operator_fat(\))operator_fat(\)) operator_fat(()ident(symbol->string) operator_fat(()ident(car) ident(right)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*sorted-on-value:food-colour*) operator_fat(()ident(sort) ident(*food-colour*) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) ident(food)operator_fat(\)) string ident(colour)operator_fat(\))operator_fat(\))operator_fat(\)) ident(*sorted-on-key:food-colour*)operator_fat(\)) comment(;; ----------------------------) comment(; Alternatively, generate a list of keys or values, sort as required,) comment(; and use list to guide the hash traversal) operator_fat(()reserved(define) ident(*sorted-food-colour-keys*) operator_fat(()ident(sort) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(pair) ident(accum)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(car) ident(pair)operator_fat(\)) ident(accum)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) ident(*food-colour*)operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) ident(left)operator_fat(\)) operator_fat(()ident(symbol->string) ident(right)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*sorted-food-colour-values*) operator_fat(()ident(sort) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(pair) ident(accum)operator_fat(\)) operator_fat(()reserved(cons) operator_fat(()ident(cdr) ident(pair)operator_fat(\)) ident(accum)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) ident(*food-colour*)operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(left) ident(right)operator_fat(\)) operator_fat(()ident(stringstring) ident(food)operator_fat(\)) string operator_fat(()ident(assoc-ref) ident(*food-colour*) ident(food)operator_fat(\))operator_fat(\))operator_fat(\)) ident(*sorted-food-colour-keys*)operator_fat(\)) comment(;; @@PLEAC@@_5.10) comment(; If merging is defined as the combining of the contents of two or more) comment(; hashes, then it is simply a matter of copying the contents of each) comment(; into a new hash) comment(; Association lists can simply be appended together) operator_fat(()reserved(define) ident(*food-colour*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Apple) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Banana) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Lemon) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Carrot) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*drink-colour*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Galliano) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Mai) ident(Tai) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*ingested-colour*) operator_fat(()ident(append) ident(*food-colour*) ident(*drink-colour*)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; Hash tables built from vectors can be copied element by element into) comment(; a new vector, or spliced together using 'vector-join' [see Chapter 4]) operator_fat(()reserved(define) ident(*food-colour*) operator_fat(()ident(make-vector) integer(20) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) comment(; ...) operator_fat(()reserved(define) ident(*drink-colour*) operator_fat(()ident(make-vector) integer(20) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) comment(; ...) operator_fat(()reserved(define) ident(*ingested-colour*) operator_fat(()ident(vector-join) ident(*food-colour*) ident(*drink-colour*)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_5.11) operator_fat(()reserved(define) ident(*common*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*this-not-that*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*dict1*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Apple) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Lemon) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Carrot) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*dict2*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Apple) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Carrot) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) comment(; Find items common to '*dict1*' and '*dict2*') operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(key) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(value) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(assoc-ref) ident(*dict2*) ident(key)operator_fat(\)) operator_fat(()reserved(set!) ident(*common*) operator_fat(()reserved(cons) ident(key) ident(*common*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) ident(*dict1*)operator_fat(\)) comment(;; ------------) comment(; Find items in '*dict1*' but not '*dict2*') operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(key) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(value) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(assoc-ref) ident(*dict2*) ident(key)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*this-not-that*) operator_fat(()reserved(cons) ident(key) ident(*this-not-that*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) ident(*dict1*)operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*non-citrus*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*citrus-colour*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Lemon) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Orange) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Lime) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*food-colour*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Apple) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Banana) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Lemon) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Carrot) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(key) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(value) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(assoc-ref) ident(*citrus-colour*) ident(key)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*non-citrus*) operator_fat(()reserved(cons) ident(key) ident(*non-citrus*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) ident(*food-colour*)operator_fat(\)) comment(;; @@PLEAC@@_5.12) comment(; All objects [including functions] are first class entities, so there) comment(; is no problem / special treatment needed to use any object, including) comment(; those classed as 'references' [e.g. file handles or ports] as keys) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*ports*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(filename)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(port) operator_fat(()ident(open-input-file) ident(filename)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*ports*) operator_fat(()ident(assoc-set!) ident(*ports*) ident(port) ident(filename)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(string-append) string operator_fat(()ident(string-drop) operator_fat(()ident(fold-right) operator_fat(()reserved(lambda) operator_fat(()ident(pair) ident(accum)operator_fat(\)) operator_fat(()ident(string-append) string operator_fat(()ident(cdr) ident(pair)operator_fat(\)) ident(accum)operator_fat(\))operator_fat(\)) string ident(*ports*)operator_fat(\)) integer(2)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(port) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(filename) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(seek) ident(port) integer(0) ident(SEEK_END)operator_fat(\)) operator_fat(()ident(print) ident(filename) string operator_fat(()ident(number->string) operator_fat(()ident(ftell) ident(port)operator_fat(\))operator_fat(\)) stringoperator_fat(\)) operator_fat(()ident(close-input-port) ident(port)operator_fat(\)) operator_fat(\))operator_fat(\)) ident(*ports*)operator_fat(\)) comment(;; @@PLEAC@@_5.13) comment(; An association list takes on the size of the number of elements with) comment(; which it is initialised, so presizing is implicit) operator_fat(()reserved(define) ident(*hash*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) comment(; zero elements) comment(;; ------------) operator_fat(()reserved(define) ident(*hash*) comment(; three elements) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Apple) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Lemon) operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()ident(Carrot) operator(.) stringoperator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; A size [i.e. number of entries] must be specified when a hash table) comment(; is created, so presizing is implicit) operator_fat(()reserved(define) ident(*hash*) operator_fat(()ident(make-hash-table) integer(100)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*hash*) operator_fat(()ident(make-vector) integer(100) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_5.14) operator_fat(()reserved(define) ident(*array*) operator_fat(()ident(list) operator_fat(')ident(a) operator_fat(')ident(b) operator_fat(')ident(c) operator_fat(')ident(d) operator_fat(')ident(d) operator_fat(')ident(a) operator_fat(')ident(a) operator_fat(')ident(c) operator_fat(')ident(d) operator_fat(')ident(d) operator_fat(')ident(e)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*count*) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(element)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(value) operator_fat(()ident(assoc-ref) ident(*count*) ident(element)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) ident(value)operator_fat(\)) operator_fat(()reserved(set!) ident(value) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(*count*) operator_fat(()ident(assoc-set!) ident(*count*) ident(element) operator_fat(()ident(+) integer(1) ident(value)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(*array*)operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) ident(*count*) operator_fat(()ident(make-hash-table) integer(20)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(element)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(value) operator_fat(()ident(hash-ref) ident(*count*) ident(element)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) ident(value)operator_fat(\)) operator_fat(()reserved(set!) ident(value) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()ident(hash-set!) ident(*count*) ident(element) operator_fat(()ident(+) integer(1) ident(value)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(*array*)operator_fat(\)) comment(;; @@PLEAC@@_5.15) operator_fat(()reserved(define) ident(*father*) operator_fat(()ident(list) operator_fat(')operator_fat(()ident(Cain) operator(.) ident(Adam)operator_fat(\)) operator_fat(')operator_fat(()ident(Abel) operator(.) ident(Adam)operator_fat(\)) operator_fat(')operator_fat(()ident(Seth) operator(.) ident(Adam)operator_fat(\)) operator_fat(')operator_fat(()ident(Enoch) operator(.) ident(Cain)operator_fat(\)) operator_fat(')operator_fat(()ident(Irad) operator(.) ident(Enoch)operator_fat(\)) operator_fat(')operator_fat(()ident(Mehujael) operator(.) ident(Irad)operator_fat(\)) operator_fat(')operator_fat(()ident(Methusael) operator(.) ident(Mehujael)operator_fat(\)) operator_fat(')operator_fat(()ident(Lamech) operator(.) ident(Methusael)operator_fat(\)) operator_fat(')operator_fat(()ident(Jabal) operator(.) ident(Lamech)operator_fat(\)) operator_fat(')operator_fat(()ident(Jubal) operator(.) ident(Lamech)operator_fat(\)) operator_fat(')operator_fat(()ident(Tubalcain) operator(.) ident(Lamech)operator_fat(\)) operator_fat(')operator_fat(()ident(Enos) operator(.) ident(Seth)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\)) operator_fat(()ident(ice-9) ident(rdelim)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(port) operator_fat(()ident(open-input-file) ident(*filename*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line&terminator) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(split)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(eof-object?) operator_fat(()ident(cdr) ident(line&terminator)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(person) operator_fat(()ident(string->symbol) operator_fat(()ident(car) ident(line&terminator)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(father) operator_fat(()ident(assoc-ref) ident(*father*) ident(person)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(father) operator_fat(()reserved(begin) operator_fat(()ident(print) ident(father)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(assoc-ref) ident(*father*) ident(father)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(split)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close-input-port) ident(port)operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\)) operator_fat(()ident(ice-9) ident(rdelim)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(assoc-invert-N:M) ident(assoc)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(new-assoc) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(pair)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(old-key) operator_fat(()ident(car) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-key) operator_fat(()ident(cdr) ident(pair)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-key-found) operator_fat(()ident(assoc-ref) ident(new-assoc) ident(new-key)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) ident(new-key-found)operator_fat(\)) operator_fat(()reserved(set!) ident(new-assoc) operator_fat(()ident(acons) ident(new-key) operator_fat(()ident(list) ident(old-key)operator_fat(\)) ident(new-assoc)operator_fat(\))operator_fat(\)) comment(;else) operator_fat(()reserved(set!) ident(new-assoc) operator_fat(()ident(assoc-set!) ident(new-assoc) ident(new-key) operator_fat(()reserved(cons) ident(old-key) ident(new-key-found)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) ident(assoc)operator_fat(\)) ident(new-assoc)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*children*) operator_fat(()ident(assoc-invert-N:M) ident(*father*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(port) operator_fat(()ident(open-input-file) ident(*filename*)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line&terminator) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(split)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(eof-object?) operator_fat(()ident(cdr) ident(line&terminator)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(person) operator_fat(()ident(string->symbol) operator_fat(()ident(car) ident(line&terminator)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(children-found) operator_fat(()ident(assoc-ref) ident(*children*) ident(person)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(person)operator_fat(\)) stringoperator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) ident(children-found)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) comment(;else) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(child)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(symbol->string) ident(child)operator_fat(\)) stringoperator_fat(\))operator_fat(\)) ident(children-found)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(split)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close-input-port) ident(port)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_5.16) comment(;; @@INCOMPLETE@@) comment(;; @@INCOMPLETE@@) comment(;; @@PLEAC@@_7.0) comment(;; use (open-input-file filename\) or (open filename O_RDONLY\)) operator_fat(()reserved(define) ident(input) operator_fat(()ident(open-input-file) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(input) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(string-match) string ident(line)operator_fat(\)) operator_fat(()ident(display) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(input) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close) ident(input)operator_fat(\)) comment(;; Many I/O functions default to the logical STDIN/OUT) comment(;; You can also explicitly get the standard ports with) comment(;; [set-]current-{input,output,error}-port.) comment(;; format takes a port as the first argument. If #t is given, format) comment(;; writes to stdout, if #f is given, format returns a string.) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; reads from stdin) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(string-match) string ident(line)operator_fat(\))operator_fat(\)) comment(;; writes to stderr) operator_fat(()ident(display) string operator_fat(()ident(current-error-port)operator_fat(\))operator_fat(\)) comment(;; writes to stdout) operator_fat(()ident(format) pre_constant(#t) string ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; use open-output-file) operator_fat(()reserved(define) ident(logfile) operator_fat(()ident(open-output-file) stringoperator_fat(\))operator_fat(\)) comment(;; increasingly specific ways of closing ports (it's safe to close a) comment(;; closed port\)) operator_fat(()ident(close) ident(logfile)operator_fat(\)) comment(; #t) operator_fat(()ident(close-port) ident(logfile)operator_fat(\)) comment(; #f (already closed\)) operator_fat(()ident(close-output-port) ident(logfile)operator_fat(\)) comment(; unspecified) comment(;; you can rebind standard ports with set-current--port:) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(old-out) operator_fat(()ident(current-output-port)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(set-current-output-port) ident(logfile)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()ident(set-current-output-port) ident(old-out)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\)) comment(;; or) operator_fat(()ident(with-output-to-file) ident(logfile) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) comment(;; @@PLEAC@@_7.1) operator_fat(()reserved(define) ident(source) operator_fat(()ident(open-input-file) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(sink) operator_fat(()ident(open-output-file) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(source) operator_fat(()ident(open) ident(path) ident(O_RDONLY)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(sink) operator_fat(()ident(open) ident(path) ident(O_WRONLY)operator_fat(\))operator_fat(\)) comment(;;-----------------------------) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open-input-file) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open-file) ident(path) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open) ident(path) ident(O_RDONLY)operator_fat(\))operator_fat(\)) comment(;;-----------------------------) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open-output-file) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open-file) ident(path) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open) ident(path) operator_fat(()ident(logior) ident(O_WRONLY) ident(O_TRUNC) ident(O_CREAT)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;;-----------------------------) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open) ident(path) operator_fat(()ident(logior) ident(O_WRONLY) ident(O_EXCL) ident(O_CREAT)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;;-----------------------------) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open-file) ident(path) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open) ident(path) operator_fat(()ident(logior) ident(O_WRONLY) ident(O_APPEND) ident(O_CREAT)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;;-----------------------------) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open) ident(path) operator_fat(()ident(logior) ident(O_WRONLY) ident(O_APPEND)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;;-----------------------------) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open) ident(path) ident(O_RDWR)operator_fat(\))operator_fat(\)) comment(;;-----------------------------) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open-file) ident(path) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open) ident(path) operator_fat(()ident(logior) ident(O_RDWR) ident(O_CREAT)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;;-----------------------------) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open) ident(path) operator_fat(()ident(logior) ident(O_RDWR) ident(O_EXCL) ident(O_CREAT)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;;-----------------------------) comment(;; @@PLEAC@@_7.2) comment(;; Nothing different needs to be done with Guile) comment(;; @@PLEAC@@_7.3) operator_fat(()reserved(define) ident(expand-user) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(rx) operator_fat(()ident(make-regexp) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(filename)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(m) operator_fat(()ident(regexp-exec) ident(rx) ident(filename)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) ident(m) operator_fat(()ident(string-append) operator_fat(()reserved(if) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\)) operator_fat(()ident(passwd:dir) operator_fat(()ident(getpwnam) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(or) operator_fat(()ident(getenv) stringoperator_fat(\)) operator_fat(()ident(getenv) stringoperator_fat(\)) operator_fat(()ident(passwd:dir) operator_fat(()ident(getpwuid) operator_fat(()ident(cuserid)operator_fat(\))operator_fat(\))operator_fat(\)) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(substring) ident(filename) operator_fat(()ident(match:end) ident(m)operator_fat(\))operator_fat(\))operator_fat(\)) ident(filename)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.4) operator_fat(()reserved(define) ident(port) operator_fat(()ident(open-file) ident(filename) ident(mode)operator_fat(\))operator_fat(\)) comment(; raise an exception on error) comment(;; use catch to trap errors) operator_fat(()ident(catch) operator_fat(')ident(system-error) comment(; the type of error thrown) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(set!) ident(port) operator_fat(()ident(open-file) ident(filename) ident(mode)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; thunk to try) operator_fat(()reserved(lambda) operator_fat(()ident(key) operator(.) ident(args)operator_fat(\)) comment(; exception handler) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(fmt) operator_fat(()ident(cadr) ident(args)operator_fat(\))operator_fat(\)) operator_fat(()ident(msg&path) operator_fat(()ident(caddr) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) operator_fat(()ident(current-error-port)operator_fat(\)) ident(fmt) operator_fat(()ident(car) ident(msg&path)operator_fat(\)) operator_fat(()ident(cadr) ident(msg&path)operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.5) comment(;; use the POSIX tmpnam) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(name) operator_fat(()ident(tmpnam)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(call-with-output-file) ident(name) operator_fat(()reserved(lambda) operator_fat(()ident(port)operator_fat(\)) comment(;; ... output to port) operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; better to test and be sure you have exclusive access to the file) comment(;; (temp file name will be available as (port-filename port\)\)) operator_fat(()reserved(define) operator_fat(()ident(open-temp-file)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(name) operator_fat(()ident(tmpnam)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(catch) operator_fat(')ident(system-error) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(open) ident(name) operator_fat(()ident(logior) ident(O_RDWR) ident(O_CREAT) ident(O_EXCL)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(key) operator(.) ident(args)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(tmpnam)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or let mkstemp! do the work for you:) operator_fat(()reserved(define) ident(port) operator_fat(()ident(mkstemp!) ident(template-string-ending-in-XXXXXX)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(tmpl) stringoperator_fat(\)) operator_fat(()ident(port) operator_fat(()ident(mkstemp!) ident(tmpl)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; tmpl now contains the name of the temp file,) comment(;; e.g. "/tmp/programhVoEzw") operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) integer(0) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(=) ident(i) integer(10)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) ident(port) string ident(i)operator_fat(\))operator_fat(\)) operator_fat(()ident(seek) ident(port) integer(0) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(concat)operator_fat(\)) operator_fat(()ident(read-line) ident(port) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(display) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(close) ident(port)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.6) comment(;; string ports are ideal for this) operator_fat(()reserved(define) ident(DATA) stringoperator_fat(\)) operator_fat(()ident(call-with-input-string) ident(DATA) operator_fat(()reserved(lambda) operator_fat(()ident(port)operator_fat(\)) comment(;; ... process input from port) operator_fat(\))operator_fat(\)) comment(;; or) operator_fat(()ident(with-input-from-string) ident(DATA) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) comment(;; ... stdin now comes from DATA) operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.7) comment(;; to process lines of current-input-port:) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) comment(;; ... do something with line) operator_fat(\)) comment(;; a general filter template:) operator_fat(()reserved(define) operator_fat(()ident(body)operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(display) ident(line)operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(args) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ... handle options here) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) operator_fat(()ident(body)operator_fat(\)) comment(; no args, just call body on stdin) operator_fat(()ident(for-each) comment(; otherwise, call body with stdin set to each arg in turn) operator_fat(()reserved(lambda) operator_fat(()ident(file)operator_fat(\)) operator_fat(()ident(catch) operator_fat(')ident(system-error) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(with-input-from-file) ident(file) ident(body)operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(key) operator(.) ident(args)operator_fat(\)) operator_fat(()ident(format) operator_fat(()ident(current-error-port)operator_fat(\)) operator_fat(()ident(cadr) ident(args)operator_fat(\)) operator_fat(()ident(caaddr) ident(args)operator_fat(\)) operator_fat(()ident(car) operator_fat(()ident(cdaddr) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(newline) operator_fat(()ident(current-error-port)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; example: count-chunks:) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-1)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\)) operator_fat(()ident(ice-9) ident(format)operator_fat(\)) operator_fat(()ident(ice-9) ident(regex)operator_fat(\))operator_fat(\)) comment(;; also use directory-files from 9.5 and globbing functions from 9.6) comment(;; can use (ice-9 getopt-long\) described in chapter 15, or process) comment(;; options by hand) operator_fat(()reserved(define) ident(opt-append) integer(0)operator_fat(\)) operator_fat(()reserved(define) ident(opt-ignore-ints) integer(0)operator_fat(\)) operator_fat(()reserved(define) ident(opt-nostdout) integer(0)operator_fat(\)) operator_fat(()reserved(define) ident(opt-unbuffer) integer(0)operator_fat(\)) operator_fat(()reserved(define) ident(args) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(opts) ident(args) operator_fat(()ident(cdr) ident(opts)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()reserved(or) operator_fat(()ident(null?) ident(opts)operator_fat(\)) operator_fat(()ident(not) operator_fat(()ident(eq?) operator_fat(()ident(string-ref) operator_fat(()ident(car) ident(opts)operator_fat(\)) integer(0)operator_fat(\)) char(#\\-)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(args) ident(opts)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(opt) operator_fat(()ident(car) ident(opts)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(string=?) ident(opt) stringoperator_fat(\)) operator_fat(()reserved(set!) ident(opt-append) operator_fat(()integer(1)ident(+) ident(opt-append)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(string=?) ident(opt) stringoperator_fat(\)) operator_fat(()reserved(set!) ident(opt-ignore-ints) operator_fat(()integer(1)ident(+) ident(opt-ignore-ints)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(string=?) ident(opt) stringoperator_fat(\)) operator_fat(()reserved(set!) ident(opt-nostdout) operator_fat(()integer(1)ident(+) ident(opt-nostdout)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(string=?) ident(opt) stringoperator_fat(\)) operator_fat(()reserved(set!) ident(opt-unbuffer) operator_fat(()integer(1)ident(+) ident(opt-unbuffer)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(throw) operator_fat(')ident(usage-error) string ident(opt)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; default to all C source files) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) operator_fat(()reserved(set!) ident(args) operator_fat(()ident(glob) string stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(find-login)operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(string-match) string ident(line)operator_fat(\)) operator_fat(()ident(display) ident(line)operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(lowercase)operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(display) operator_fat(()ident(string-downcase) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(newline)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(count-chunks)operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\)) operator_fat(()ident(chunks) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()reserved(or) operator_fat(()ident(eof-object?) ident(line)operator_fat(\)) operator_fat(()ident(string=?) ident(line) stringoperator_fat(\)) operator_fat(()ident(string=?) ident(line) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(chunks)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(tokens) operator_fat(()ident(string-tokenize) operator_fat(()ident(string-take) ident(line) operator_fat(()reserved(or) operator_fat(()ident(string-index) ident(line) char(#\\#)operator_fat(\)) operator_fat(()ident(string-length) ident(line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(chunks) operator_fat(()ident(+) ident(chunks) operator_fat(()ident(length) ident(tokens)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) operator_fat(()ident(count-chunks)operator_fat(\)) comment(; or find-login, lowercase, etc.) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(file)operator_fat(\)) operator_fat(()ident(catch) operator_fat(')ident(system-error) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(with-input-from-file) ident(file) ident(count-chunks)operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(key) operator(.) ident(args)operator_fat(\)) operator_fat(()ident(format) operator_fat(()ident(current-error-port)operator_fat(\)) operator_fat(()ident(cadr) ident(args)operator_fat(\)) operator_fat(()ident(caaddr) ident(args)operator_fat(\)) operator_fat(()ident(car) operator_fat(()ident(cdaddr) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(newline) operator_fat(()ident(current-error-port)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(args)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.8) comment(;; write changes to a temporary file then rename it) operator_fat(()ident(with-input-from-file) ident(old) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(with-output-to-file) ident(new) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) comment(;; change line, then...) operator_fat(()ident(write-line) ident(line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(rename-file) ident(old) operator_fat(()ident(string-append) ident(old) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(rename-file) ident(new) ident(old)operator_fat(\)) comment(;; @@PLEAC@@_7.9) comment(;; no -i switch) comment(;; @@PLEAC@@_7.10) comment(;; open the file in read/write mode, slurp up the contents, modify it,) comment(;; then write it back out:) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(p) operator_fat(()ident(open-file) ident(file) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(lines) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; read in lines) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\)) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(lines) operator_fat(()reserved(cons) ident(line) ident(lines)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; modify (reverse lines\)) operator_fat(()ident(seek) ident(p) integer(0) ident(SEEK_SET)operator_fat(\)) comment(;; write out lines) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(write-line) ident(x) ident(p)operator_fat(\))operator_fat(\)) ident(lines)operator_fat(\)) comment(;; truncate the file) operator_fat(()ident(truncate-file) ident(p)operator_fat(\)) operator_fat(()ident(close) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(p) operator_fat(()ident(open-file) string stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(lines) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()ident(date) operator_fat(()ident(date->string) operator_fat(()ident(current-date)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p) operator_fat(')ident(concat)operator_fat(\)) operator_fat(()ident(read-line) ident(p) operator_fat(')ident(concat)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(lines) operator_fat(()reserved(cons) ident(line) ident(lines)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(seek) ident(p) integer(0) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(regexp-substitute/global) ident(p) string ident(x) operator_fat(')ident(pre) ident(date) operator_fat(')ident(post)operator_fat(\))operator_fat(\)) operator_fat(()ident(reverse) ident(lines)operator_fat(\))operator_fat(\)) operator_fat(()ident(truncate-file) ident(p)operator_fat(\)) operator_fat(()ident(close) ident(p)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.11) operator_fat(()reserved(define) ident(p) operator_fat(()ident(open-file) ident(path) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(flock) ident(p) ident(LOCK_EX)operator_fat(\)) comment(;; update the file, then...) operator_fat(()ident(close) ident(p)operator_fat(\)) comment(;; to increment a number in a file) operator_fat(()reserved(define) ident(p) operator_fat(()ident(open) string operator_fat(()ident(logior) ident(O_RDWR) ident(O_CREAT)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(flock) ident(p) ident(LOCK_EX)operator_fat(\)) comment(;; Now we have acquired the lock, it's safe for I/O) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(obj) operator_fat(()ident(read) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()ident(num) operator_fat(()reserved(if) operator_fat(()ident(eof-object?) ident(obj)operator_fat(\)) integer(0) ident(obj)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(seek) ident(p) integer(0) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(truncate-file) ident(p)operator_fat(\)) operator_fat(()ident(write) operator_fat(()integer(1)ident(+) ident(num)operator_fat(\)) ident(p)operator_fat(\)) operator_fat(()ident(newline) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()ident(close) ident(p)operator_fat(\)) comment(;; @@PLEAC@@_7.12) comment(;; use force-output) operator_fat(()ident(force-output) ident(p)operator_fat(\)) comment(;; flush all open ports) operator_fat(()ident(flush-all-ports)operator_fat(\)) comment(;; @@PLEAC@@_7.13) comment(;; use select) operator_fat(()ident(select) ident(inputs) ident(outputs) ident(exceptions) ident(seconds)operator_fat(\)) operator_fat(()ident(select) operator_fat(()ident(list) ident(p1) ident(p2) ident(p3)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(nfound) operator_fat(()ident(select) operator_fat(()ident(list) ident(inport)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(inputs) operator_fat(()ident(car) ident(nfound)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(null?) ident(inputs)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(inport)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or use char-ready? if you only need a single character) operator_fat(()reserved(if) operator_fat(()ident(char-ready?) ident(p)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(read-char) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.14) comment(;; use the O_NONBLOCK option with open) operator_fat(()reserved(define) ident(modem) operator_fat(()ident(open) string operator_fat(()ident(logior) ident(O_RDWR) ident(O_NONBLOCK)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or use fcntl if you already have a port) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(flags) operator_fat(()ident(fcntl) ident(p) ident(F_GETFD)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(fcntl) ident(p) ident(F_SETFD) operator_fat(()ident(logior) ident(flags) ident(O_NONBLOCK)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.15) comment(;; use stat) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(buf) operator_fat(()ident(make-string) operator_fat(()ident(stat:size) operator_fat(()ident(stat) ident(p)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(read-string!/partial) ident(buf) ident(input)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.16) comment(;; not needed - ports are first class objects) comment(;; @@PLEAC@@_7.18) comment(;; use for-each on the list of ports:) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(p)operator_fat(\)) operator_fat(()ident(display) ident(stuff-to-print) ident(p)operator_fat(\))operator_fat(\)) ident(port-list)operator_fat(\)) comment(;; or, if you don't want to keep track of the port list and know you) comment(;; want to print to all open output ports, you can use port-for-each:) operator_fat(()ident(port-for-each) operator_fat(()reserved(lambda) operator_fat(()ident(p)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(output-port?) ident(p)operator_fat(\)) operator_fat(()ident(display) ident(stuff) ident(p)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_7.19) comment(;; use fdopen:) operator_fat(()reserved(define) ident(p) operator_fat(()ident(fdopen) ident(num) ident(mode)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(p) operator_fat(()ident(fdopen) integer(3) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(p) operator_fat(()ident(fdopen) operator_fat(()ident(string->number) operator_fat(()ident(getenv) stringoperator_fat(\))operator_fat(\)) stringoperator_fat(\))operator_fat(\)) comment(;; after processing) operator_fat(()ident(close) ident(p)operator_fat(\)) comment(;; @@PLEAC@@_7.20) comment(;; ports are first class objects and can be aliased and passed around) comment(;; like any other non-immediate variables:) operator_fat(()reserved(define) ident(alias) ident(original)operator_fat(\)) operator_fat(()reserved(define) ident(old-in) operator_fat(()ident(current-input-port)operator_fat(\))operator_fat(\)) comment(;; or you can open two separate ports on the same file:) operator_fat(()reserved(define) ident(p1) operator_fat(()ident(open-input-file) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(p2) operator_fat(()ident(open-input-file) ident(path)operator_fat(\))operator_fat(\)) comment(;; or use fdopen:) operator_fat(()reserved(define) ident(copy-of-p) operator_fat(()ident(fdopen) operator_fat(()ident(fileno) ident(p)operator_fat(\)) ident(mode)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(old-out) operator_fat(()ident(current-output-port)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(old-err) operator_fat(()ident(current-error-port)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(new-out) operator_fat(()ident(open-output-file) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(set-current-output-port) ident(new-out)operator_fat(\)) operator_fat(()ident(set-current-error-port) ident(new-out)operator_fat(\)) operator_fat(()ident(system) ident(joe-random-program)operator_fat(\)) operator_fat(()ident(close) ident(new-out)operator_fat(\)) operator_fat(()ident(set-current-output-port) ident(old-out)operator_fat(\)) operator_fat(()ident(set-current-error-port) ident(old-out)operator_fat(\)) comment(;; @@PLEAC@@_8.0) comment(;; open the file and loop through the port with read-line:) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(p) operator_fat(()ident(open-input-file) ident(file)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\)) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(string-length) ident(line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(close) ident(p)operator_fat(\))operator_fat(\)) comment(;; you can use with-input-from-file to temporarily rebind stdin:) operator_fat(()ident(with-input-from-file) ident(file) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(string-length) ident(line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or define a utility procedure to do this) operator_fat(()reserved(define) operator_fat(()ident(for-each-line) ident(proc) ident(file)operator_fat(\)) operator_fat(()ident(with-input-from-file) ident(file) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(proc) ident(line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each-line) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(string-length) ident(line)operator_fat(\))operator_fat(\))operator_fat(\)) ident(file)operator_fat(\)) comment(;; read in the file as a list of lines) operator_fat(()reserved(define) operator_fat(()ident(read-lines) ident(file)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(ls) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(with-input-from-file) ident(file) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\)) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) ident(line) ident(ls)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(reverse) ident(ls)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; read in the file as a single string) operator_fat(()reserved(define) operator_fat(()ident(file-contents) ident(file)operator_fat(\)) operator_fat(()ident(call-with-input-file) ident(file) operator_fat(()reserved(lambda) operator_fat(()ident(p)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(size) operator_fat(()ident(stat:size) operator_fat(()ident(stat) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(buf) operator_fat(()ident(make-string) ident(size)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(read-string!/partial) ident(buf) ident(p)operator_fat(\)) ident(buf)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; use display to print human readable output) operator_fat(()ident(display) operator_fat(')operator_fat(()string string stringoperator_fat(\)) ident(port)operator_fat(\)) comment(; (One two three\)) operator_fat(()ident(display) stringoperator_fat(\)) comment(; Sent to default output port) comment(;; use write to print machine readable output) operator_fat(()ident(write) operator_fat(')operator_fat(()string string stringoperator_fat(\)) ident(port)operator_fat(\)) comment(; ("One" "two" "three"\)) comment(;; use (ice-9 rw\) to read/write fixed-length blocks of data:) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(rw)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(buffer) operator_fat(()ident(make-string) integer(4096)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(read-string!/partial) ident(buffer) ident(port) integer(4096)operator_fat(\))operator_fat(\)) comment(;; truncate-file) operator_fat(()ident(truncate-file) ident(port) ident(length)operator_fat(\)) comment(; truncate to length) operator_fat(()ident(truncate-file) ident(port)operator_fat(\)) comment(; truncate to current pos) comment(;; ftell) operator_fat(()reserved(define) ident(pos) operator_fat(()ident(ftell) ident(port)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(pos)operator_fat(\)) comment(;; seek) operator_fat(()ident(seek) ident(log-port) integer(0) ident(SEEK_END)operator_fat(\)) comment(; seek to end) operator_fat(()ident(seek) ident(data-port) ident(pos) ident(SEEK_SET)operator_fat(\)) comment(; seek to pos) operator_fat(()ident(seek) ident(out-port) ident(-)integer(20) ident(SEEK_CUR)operator_fat(\)) comment(; seek back 20 bytes) comment(;; block read/write) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(rw)operator_fat(\))operator_fat(\)) operator_fat(()ident(write-string/partial) ident(mystring) ident(data-port) operator_fat(()ident(string-length) ident(mystring)operator_fat(\))operator_fat(\)) operator_fat(()ident(read-string!/partial) ident(block) integer(256) integer(5)operator_fat(\)) comment(;; @@PLEAC@@_8.1) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(rx) operator_fat(()ident(make-regexp) stringoperator_fat(\))operator_fat(\))operator_fat(\)) comment(; or "(.*\)\\\\\\\\\\\\s*$") operator_fat(()ident(with-input-from-file) ident(file) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(m) operator_fat(()ident(regexp-exec) ident(rx) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(next) operator_fat(()ident(read-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()reserved(and) ident(m) operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(next)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(string-append) operator_fat(()ident(match:substring) ident(m) integer(1)operator_fat(\)) ident(next)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(else) comment(;; else process line here, then recurse) operator_fat(()ident(loop) ident(next)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_8.2) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\)) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()ident(i) integer(0) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\)) ident(i)operator_fat(\))operator_fat(\)) comment(;; fastest way if your terminator is a single newline) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(rw)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(buf) operator_fat(()ident(make-string) operator_fat(()ident(expt) integer(2) integer(16)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(count) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(len) operator_fat(()ident(read-string!/partial) ident(buf) ident(p)operator_fat(\)) operator_fat(()ident(read-string!/partial) ident(buf) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(not) ident(len)operator_fat(\)) ident(count)operator_fat(\)) operator_fat(()reserved(set!) ident(count) operator_fat(()ident(+) ident(count) operator_fat(()ident(string-count) ident(buf) char(#\\newline) integer(0) ident(len)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or use port-line) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eof-object?) ident(line)operator_fat(\)) operator_fat(()ident(port-line) ident(p)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_8.3) comment(;; default behaviour of string-tokenize is to split on whitespace:) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) ident(eof-object?) ident(line)operator_fat(\)) operator_fat(()ident(for-each) ident(some-function-of-word) operator_fat(()ident(string-tokenize) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(table) operator_fat(()ident(make-hash-table) integer(31)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(w)operator_fat(\)) operator_fat(()ident(hash-set!) ident(table) ident(w) operator_fat(()integer(1)ident(+) operator_fat(()ident(hash-ref) ident(table) ident(w) integer(0)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(string-tokenize) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(hash-fold) operator_fat(()reserved(lambda) operator_fat(()ident(k) ident(v) ident(p)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(v) ident(k)operator_fat(\))operator_fat(\)) pre_constant(#f) ident(table)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_8.4) comment(;; build up the list the reverse it or fold over it:) operator_fat(()reserved(define) ident(lines) operator_fat(()ident(read-lines) ident(file)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(word)operator_fat(\)) ident(do-something-with-word)operator_fat(\)) operator_fat(()ident(reverse) ident(lines)operator_fat(\))operator_fat(\)) operator_fat(()ident(fold) operator_fat(()reserved(lambda) operator_fat(()ident(word) ident(acc)operator_fat(\)) ident(do-something-with-word)operator_fat(\)) pre_constant(#f) ident(lines)operator_fat(\)) comment(;; @@PLEAC@@_8.5) comment(;; save the current position and reseek to it) operator_fat(()reserved(define) operator_fat(()ident(tail) ident(file)operator_fat(\)) operator_fat(()ident(call-with-input-file) ident(file) operator_fat(()reserved(lambda) operator_fat(()ident(p)operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(eof-object?) ident(line)operator_fat(\)) operator_fat(()ident(sleep) ident(sometime)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(pos) operator_fat(()ident(ftell) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(seek) ident(p) integer(0) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(seek) ident(p) ident(pos) ident(SEEK_SET)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(else) comment(;; process line) operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_8.6) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(rand-line) pre_constant(#f)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(eof-object?) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(=) integer(0) operator_fat(()ident(random) operator_fat(()ident(port-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(rand-line) ident(line)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; rand-line is the random line) operator_fat(\)) comment(;; @@PLEAC@@_8.7) operator_fat(()reserved(define) operator_fat(()ident(shuffle) ident(list)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(v) operator_fat(()ident(list->vector) ident(list)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) operator_fat(()integer(1)ident(-) operator_fat(()ident(vector-length) ident(v)operator_fat(\))operator_fat(\)) operator_fat(()integer(1)ident(-) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(<) ident(i) integer(0)operator_fat(\)) operator_fat(()ident(vector->list) ident(v)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(j) operator_fat(()ident(random) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(=) ident(i) ident(j)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(temp) operator_fat(()ident(vector-ref) ident(v) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-set!) ident(v) ident(i) operator_fat(()ident(vector-ref) ident(v) ident(j)operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-set!) ident(v) ident(j) ident(temp)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(rand-lines) operator_fat(()ident(shuffle) operator_fat(()ident(read-lines) ident(file)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_8.8) comment(;; looking for line number desired-line-number) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\)) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(=) operator_fat(()operator_fat(()ident(port-line) ident(p)operator_fat(\)) ident(desired-line-number)operator_fat(\)) ident(line)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or read into a list) operator_fat(()reserved(define) ident(lines) operator_fat(()ident(read-lines) ident(file)operator_fat(\))operator_fat(\)) operator_fat(()ident(list-ref) ident(lines) ident(desired-line-number)operator_fat(\)) comment(;; @@INCOMPLETE@@) comment(; (define (build-index data-file index-file\)) comment(; \)) comment(; (define (line-with-index data-file index-file line-number\)) comment(; \)) comment(;; @@PLEAC@@_8.9) comment(;; use string-tokenize with an appropriate character set) operator_fat(()ident(use-modules) operator_fat(()ident(srfi) ident(srfi-13)operator_fat(\)) operator_fat(()ident(srfi) ident(srfi-14)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(fields) operator_fat(()ident(string-tokenize) ident(line) operator_fat(()ident(string->charset) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(fields) operator_fat(()ident(string-tokenize) ident(line) operator_fat(()ident(string->charset) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(fields) operator_fat(()ident(string-tokenize) ident(line)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_8.10) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(p) operator_fat(()ident(open-file) ident(file) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(pos) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(line) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(eof-object?) operator_fat(()ident(peek-char) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()ident(seek) ident(p) integer(0) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(truncate-file) ident(p) ident(pos)operator_fat(\)) operator_fat(()ident(close) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(set!) ident(pos) operator_fat(()ident(ftell) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-line) ident(p)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_8.11) comment(;; no equivalent - don't know how Guile under windows handles this) comment(;; @@PLEAC@@_8.12) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(address) operator_fat(()ident(*) ident(recsize) ident(recno)operator_fat(\))operator_fat(\)) operator_fat(()ident(buf) operator_fat(()ident(make-string) ident(recsize)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(seek) ident(p) ident(address) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(read-string!/partial) ident(buf) ident(p)operator_fat(\)) ident(buf)operator_fat(\)) comment(;; @@PLEAC@@_8.13) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(address) operator_fat(()ident(*) ident(recsize) ident(recno)operator_fat(\))operator_fat(\)) operator_fat(()ident(buf) operator_fat(()ident(make-string) ident(recsize)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(seek) ident(p) ident(address) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(read-string!/partial) ident(buf) ident(p)operator_fat(\)) comment(;; modify buf, then write back with) operator_fat(()ident(seek) ident(p) ident(address) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(write-string/partial) ident(buf) ident(p)operator_fat(\)) operator_fat(()ident(close) ident(p)operator_fat(\))operator_fat(\)) comment(;; @@INCOMPLETE@@) comment(;; weekearly) comment(;; @@PLEAC@@_8.14) operator_fat(()ident(seek) ident(p) ident(addr) ident(SEEK_SET)operator_fat(\)) operator_fat(()reserved(define) ident(str) operator_fat(()ident(read-delimited) operator_fat(()ident(make-string) integer(1) char(#\\n)ident(ul)operator_fat(\)) ident(p)operator_fat(\))operator_fat(\)) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; bgets -- get a string from an address in a binary file) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(format)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(args) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(file) operator_fat(()ident(car) ident(args)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(addrs) operator_fat(()ident(map) ident(string->number) operator_fat(()ident(cdr) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(delims) operator_fat(()ident(make-string) integer(1) char(#\\n)ident(ul)operator_fat(\))operator_fat(\)) operator_fat(()ident(call-with-input-file) ident(file) operator_fat(()reserved(lambda) operator_fat(()ident(p)operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(addr)operator_fat(\)) operator_fat(()ident(seek) ident(p) ident(addr) ident(SEEK_SET)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(addr) ident(addr) ident(addr) operator_fat(()ident(read-delimited) ident(delims) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) ident(addrs)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@INCOMPLETE@@) comment(;; strings) comment(;; @@PLEAC@@_9.0) operator_fat(()reserved(define) ident(entry) operator_fat(()ident(stat) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(entry) operator_fat(()ident(stat) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(entry) operator_fat(()ident(stat) ident(port)operator_fat(\))operator_fat(\)) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(posix)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(inode) operator_fat(()ident(stat) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(ctime) operator_fat(()ident(stat:ctime) ident(inode)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(size) operator_fat(()ident(stat:size) ident(inode)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(F) operator_fat(()ident(open-input-file) ident(filename)operator_fat(\))operator_fat(\)) comment(;; no equivalent - what defines -T?) comment(; unless (-s F && -T _\) {) comment(; die "$filename doesn't have text in it.\\n";) comment(; }) operator_fat(()reserved(define) ident(dir) operator_fat(()ident(opendir) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(filename) operator_fat(()ident(readdir) ident(dir)operator_fat(\)) operator_fat(()ident(readdir) ident(dir)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(filename)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(filename)operator_fat(\))operator_fat(\)) operator_fat(()ident(closedir) ident(dir)operator_fat(\)) comment(;; @@PLEAC@@_9.1) operator_fat(()reserved(define) ident(inode) operator_fat(()ident(stat) ident(filename)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(readtime) operator_fat(()ident(stat:atime) ident(inode)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(writetime) operator_fat(()ident(stat:mtime) ident(inode)operator_fat(\))operator_fat(\)) operator_fat(()ident(utime) ident(newreadtime) ident(newwritetime) ident(filename)operator_fat(\)) operator_fat(()reserved(define) ident(seconds-per-day) operator_fat(()ident(*) integer(60) integer(60) integer(24)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(inode) operator_fat(()ident(stat) ident(file)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(atime) operator_fat(()ident(stat:atime) ident(inode)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(mtime) operator_fat(()ident(stat:mtime) ident(inode)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(atime) operator_fat(()ident(-) ident(atime) operator_fat(()ident(*) integer(7) ident(seconds-per-day)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(mtime) operator_fat(()ident(-) ident(mtime) operator_fat(()ident(*) integer(7) ident(seconds-per-day)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(utime) ident(file) ident(atime) ident(mtime)operator_fat(\)) comment(;; mtime is optional) operator_fat(()ident(utime) ident(file) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\)) operator_fat(()ident(utime) ident(file) operator_fat(()ident(stat:atime) operator_fat(()ident(stat) ident(file)operator_fat(\))operator_fat(\)) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\)) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; uvi - vi a file without changing its access times) operator_fat(()reserved(define) ident(file) operator_fat(()ident(cadr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(inode) operator_fat(()ident(stat) ident(file)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(atime) operator_fat(()ident(stat:atime) ident(inode)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(mtime) operator_fat(()ident(stat:mtime) ident(inode)operator_fat(\))operator_fat(\)) operator_fat(()ident(system) operator_fat(()ident(string-append) operator_fat(()reserved(or) operator_fat(()ident(getenv) stringoperator_fat(\)) stringoperator_fat(\)) string ident(file)operator_fat(\))operator_fat(\)) operator_fat(()ident(utime) ident(file) ident(atime) ident(mtime)operator_fat(\)) comment(;; @@PLEAC@@_9.2) operator_fat(()ident(delete-file) ident(file)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(count) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(catch) pre_constant(#t) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(delete-file) ident(x)operator_fat(\)) operator_fat(()reserved(set!) ident(count) operator_fat(()integer(1)ident(+) ident(count)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(err) operator(.) ident(args)operator_fat(\)) pre_constant(#f)operator_fat(\))operator_fat(\))operator_fat(\)) ident(file-list)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(=) ident(count) operator_fat(()ident(length) ident(file-list)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) operator_fat(()ident(current-error-port)operator_fat(\)) string ident(count) operator_fat(()ident(length) ident(file-list)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_9.3) comment(;; use builtin copy-file) operator_fat(()ident(copy-file) ident(oldfile) ident(newfile)operator_fat(\)) operator_fat(()ident(rename-file) ident(oldfile) ident(newfile)operator_fat(\)) comment(;; or do it by hand (clumsy, error-prone\)) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(rw)operator_fat(\)) operator_fat(()ident(ice-9) ident(posix)operator_fat(\))operator_fat(\)) operator_fat(()ident(with-input-from-file) ident(oldfile) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(call-with-output-file) ident(newfile) operator_fat(()reserved(lambda) operator_fat(()ident(p)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(inode) operator_fat(()ident(stat) ident(oldfile)operator_fat(\))operator_fat(\)) operator_fat(()ident(blksize) operator_fat(()reserved(if) ident(inode) operator_fat(()ident(stat:size) ident(inode)operator_fat(\)) integer(16384)operator_fat(\))operator_fat(\)) operator_fat(()ident(buf) operator_fat(()ident(make-string) ident(blksize)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(len) operator_fat(()ident(read-string!/partial) ident(buf)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()reserved(and) ident(len) operator_fat(()ident(>) ident(len) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()ident(write-string/partial) ident(buf) ident(p) integer(0) ident(len)operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(read-string!/partial) ident(buf)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or call out to the system (non-portable, insecure\)) operator_fat(()ident(system) operator_fat(()ident(string-append) string ident(oldfile) string ident(newfile)operator_fat(\))operator_fat(\)) comment(; unix) operator_fat(()ident(system) operator_fat(()ident(string-append) string ident(oldfile) string ident(newfile)operator_fat(\))operator_fat(\)) comment(; dos, vms) comment(;; @@PLEAC@@_9.4) comment(;; use a hash lookup of inodes) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(posix)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(seen) operator_fat(()ident(make-hash-table) integer(31)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(file)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(stats) operator_fat(()ident(stat) ident(file)operator_fat(\))operator_fat(\)) operator_fat(()ident(key) operator_fat(()reserved(cons) operator_fat(()ident(stat:dev) ident(stats)operator_fat(\)) operator_fat(()ident(stat:ino) ident(stats)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(val) operator_fat(()ident(hash-ref) ident(seen) ident(key) integer(0)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(val) integer(0)operator_fat(\)) comment(;; do something with new file) operator_fat(\))operator_fat(\)) operator_fat(()ident(hash-set!) ident(seen) ident(key) operator_fat(()integer(1)ident(+) ident(val)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(file-names)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(seen) operator_fat(()ident(make-hash-table) integer(31)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(file)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(stats) operator_fat(()ident(stat) ident(file)operator_fat(\))operator_fat(\)) operator_fat(()ident(key) operator_fat(()reserved(cons) operator_fat(()ident(stat:dev) ident(stats)operator_fat(\)) operator_fat(()ident(stat:ino) ident(stats)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(val) operator_fat(()ident(hash-ref) ident(seen) ident(key) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(hash-set!) ident(seen) ident(key) operator_fat(()reserved(cons) ident(file) ident(val)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(file-names)operator_fat(\)) operator_fat(()ident(hash-fold) operator_fat(()reserved(lambda) operator_fat(()ident(key) ident(value) ident(prior)operator_fat(\)) comment(;; process key == (dev . inode\), value == list of filenames) operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) ident(seen)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_9.5) comment(;; use opendir, readdir, closedir) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(p) operator_fat(()ident(opendir) ident(dir)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(file) operator_fat(()ident(readdir) ident(p)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eof-object?) ident(file)operator_fat(\)) operator_fat(()ident(close) ident(p)operator_fat(\)) comment(;; do something with file) operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; or define a utility function for this) operator_fat(()reserved(define) operator_fat(()ident(directory-files) ident(dir)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(access?) ident(dir) ident(R_OK)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(p) operator_fat(()ident(opendir) ident(dir)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(file) operator_fat(()ident(readdir) ident(p)operator_fat(\)) operator_fat(()ident(readdir) ident(p)operator_fat(\))operator_fat(\)) operator_fat(()ident(ls) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(eof-object?) ident(file)operator_fat(\)) operator_fat(()ident(closedir) ident(p)operator_fat(\)) operator_fat(()ident(reverse!) ident(ls)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) ident(file) ident(ls)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; to skip . and ..) operator_fat(()ident(cddr) operator_fat(()ident(directory-files) ident(dir)operator_fat(\))operator_fat(\)) comment(;; probably better to implement full Emacs style directory-files) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(posix)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(plain-files) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(rx) operator_fat(()ident(make-regexp) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(dir)operator_fat(\)) operator_fat(()ident(sort) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(eq?) operator_fat(')ident(regular) operator_fat(()ident(stat:type) operator_fat(()ident(stat) ident(x)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(string-append) ident(dir) string ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(remove) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(regexp-exec) ident(rx) ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(cddr) operator_fat(()ident(directory-files) ident(dir)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(string<)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_9.6) operator_fat(()reserved(define) operator_fat(()ident(glob->regexp) ident(pat)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(len) operator_fat(()ident(string-length) ident(pat)operator_fat(\))operator_fat(\)) operator_fat(()ident(ls) operator_fat(')operator_fat(()stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(in-brace?) pre_constant(#f)operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) integer(0) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(=) ident(i) ident(len)operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(char) operator_fat(()ident(string-ref) ident(pat) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(case) ident(char) operator_fat(()operator_fat(()char(#\\*)operator_fat(\)) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) string ident(ls)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()char(#\\?)operator_fat(\)) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) string ident(ls)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()char(#\\[)operator_fat(\)) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) string ident(ls)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()char(#\\])operator_fat(\)) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) string ident(ls)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()char(#\\\\)operator_fat(\)) operator_fat(()reserved(set!) ident(i) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) operator_fat(()ident(make-string) integer(1) operator_fat(()ident(string-ref) ident(pat) ident(i)operator_fat(\))operator_fat(\)) ident(ls)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) string ident(ls)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(set!) ident(ls) operator_fat(()reserved(cons) operator_fat(()ident(regexp-quote) operator_fat(()ident(make-string) integer(1) ident(char)operator_fat(\))operator_fat(\)) ident(ls)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(string-concatenate) operator_fat(()ident(reverse) operator_fat(()reserved(cons) string ident(ls)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(glob) ident(pat) ident(dir)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(rx) operator_fat(()ident(make-regexp) operator_fat(()ident(glob->regexp) ident(pat)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(regexp-exec) ident(rx) ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(directory-files) ident(dir)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(files) operator_fat(()ident(glob) string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(files) operator_fat(()ident(glob) string stringoperator_fat(\))operator_fat(\)) comment(;; Not sure if the Schwartzian Transform would really be more) comment(;; efficient here... perhaps with a much larger directory where very) comment(;; few files matched.) operator_fat(()reserved(define) ident(dirs) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(eq?) operator_fat(')ident(directory) operator_fat(()ident(stat:type) operator_fat(()ident(stat) ident(x)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(string-append) ident(dir) string ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(sort) operator_fat(()ident(filter) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(string-match) string ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(directory-files) ident(dir)operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(a) ident(b)operator_fat(\)) operator_fat(()ident(<) operator_fat(()ident(string->number) ident(a)operator_fat(\)) operator_fat(()ident(string->number) ident(b)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_9.7) operator_fat(()reserved(define) operator_fat(()ident(find) ident(proc) operator(.) ident(dirs)operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(pair?) ident(dirs)operator_fat(\)) operator_fat(()ident(for-each) ident(proc) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(string-append) operator_fat(()ident(car) ident(dirs)operator_fat(\)) string ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(directory-files) operator_fat(()ident(car) ident(dirs)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(apply) ident(find) ident(proc) operator_fat(()ident(cdr) ident(dirs)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(find) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(x) operator_fat(()reserved(if) operator_fat(()ident(equal?) operator_fat(()ident(stat:type) operator_fat(()ident(stat) ident(x)operator_fat(\))operator_fat(\)) operator_fat(')ident(directory)operator_fat(\)) string stringoperator_fat(\))operator_fat(\))operator_fat(\)) stringoperator_fat(\)) operator_fat(()reserved(define) ident(saved-size) ident(-)integer(1)operator_fat(\)) operator_fat(()reserved(define) ident(saved-name) stringoperator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(biggest) ident(file)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(stats) operator_fat(()ident(stat) ident(file)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eq?) operator_fat(()ident(stat:type) ident(stats)operator_fat(\)) operator_fat(')ident(regular)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(size) operator_fat(()ident(stat:size) operator_fat(()ident(stat) ident(file)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(>) ident(size) ident(saved-size)operator_fat(\)) operator_fat(()reserved(set!) ident(saved-size) ident(size)operator_fat(\)) operator_fat(()reserved(set!) ident(saved-name) ident(file)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(apply) ident(find) ident(biggest) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(saved-name) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\)) ident(saved-size)operator_fat(\)) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; fdirs - find all directories) operator_fat(()reserved(define) operator_fat(()ident(print-dirs) ident(f)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eq?) operator_fat(()ident(stat:type) operator_fat(()ident(stat) ident(f)operator_fat(\))operator_fat(\)) operator_fat(')ident(directory)operator_fat(\)) operator_fat(()ident(write-line) ident(f)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(apply) ident(find) ident(print-dirs) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_9.8) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; rmtree - remove whole directory trees like rm -f) operator_fat(()reserved(define) operator_fat(()ident(finddepth) ident(proc) operator(.) ident(dirs)operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(pair?) ident(dirs)operator_fat(\)) operator_fat(()ident(apply) ident(finddepth) ident(proc) operator_fat(()ident(cdr) ident(dirs)operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) ident(proc) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(x)operator_fat(\)) operator_fat(()ident(string-append) operator_fat(()ident(car) ident(dirs)operator_fat(\)) string ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(directory-files) operator_fat(()ident(car) ident(dirs)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(zap) ident(f)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(rm) operator_fat(()reserved(if) operator_fat(()ident(eq?) operator_fat(()ident(stat:type) operator_fat(()ident(stat) ident(f)operator_fat(\))operator_fat(\)) operator_fat(')ident(directory)operator_fat(\)) ident(rmdir) ident(delete-file)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(f)operator_fat(\)) operator_fat(()ident(catch) pre_constant(#t) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(rm) ident(f)operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) ident(args) operator_fat(()ident(format) pre_constant(#t) string ident(f)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(args) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) operator_fat(()ident(error) stringoperator_fat(\)) operator_fat(()ident(apply) ident(finddepth) ident(zap) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_9.9) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(file)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(newname) operator_fat(()ident(function-of) ident(file)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(catch) pre_constant(#t) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(rename-file) ident(file) ident(newname)operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) ident(args) operator_fat(()ident(format) operator_fat(()ident(current-error-port)operator_fat(\)) string ident(file) ident(newname)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(names)operator_fat(\)) error(#)ident(!/usr/local/bin/guile) ident(-)ident(s) ident(!)error(#) comment(;; rename - Guile's filename fixer) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(regex)operator_fat(\))operator_fat(\)) comment(; not needed, but often useful here) operator_fat(()reserved(define) ident(args) operator_fat(()ident(cdr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) operator_fat(()ident(error) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(proc) operator_fat(()ident(eval-string) operator_fat(()ident(car) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(old)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(new) operator_fat(()ident(proc) ident(old)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(string=?) ident(old) ident(new)operator_fat(\))operator_fat(\)) operator_fat(()ident(catch) pre_constant(#t) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(rename-file) ident(old) ident(new)operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) ident(args) operator_fat(()ident(format) operator_fat(()ident(current-error-port)operator_fat(\)) string ident(old) ident(new)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(cdr) ident(args)operator_fat(\))operator_fat(\)) comment(;; command-line examples:) comment(;; rename '(lambda (x\) (regexp-substitute/global #f "\\\\.orig\\$" x (quote pre\)\)\)' *.orig) comment(;; rename string-downcase *) comment(;; rename '(lambda (x\) (if (string-match "^Make" x\) x (string-downcase x\)\)\)' *) comment(;; rename '(lambda (x\) (string-append x ".bad"\)\)' *.pl) comment(;; rename '(lambda (x\) (format #t "~a: "\) (read-line\)\)' *) comment(;; @@PLEAC@@_9.10) operator_fat(()reserved(define) ident(base) operator_fat(()ident(basename) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(base) operator_fat(()ident(dirname) ident(path) ident(ext)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(dir) operator_fat(()ident(dirname) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(path) stringoperator_fat(\)) operator_fat(()reserved(define) ident(file) operator_fat(()ident(basename) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(dir) operator_fat(()ident(dirname) ident(path)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(dir) ident(file)operator_fat(\)) operator_fat(()ident(basename) ident(path) stringoperator_fat(\)) comment(; libc) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(regex)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(file-parse) ident(path) operator(.) ident(args)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(ext) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(args)operator_fat(\)) string operator_fat(()ident(car) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(rx1) operator_fat(()ident(string-append) string ident(ext) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(rx2) operator_fat(()ident(string-append) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(m) operator_fat(()reserved(or) operator_fat(()ident(string-match) ident(rx1) ident(path)operator_fat(\)) operator_fat(()ident(string-match) ident(rx2) ident(path)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(list) operator_fat(()ident(match:substring) ident(m) integer(2)operator_fat(\)) operator_fat(()ident(match:substring) ident(m) integer(3)operator_fat(\)) operator_fat(()ident(match:substring) ident(m) integer(4)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(extension) ident(path) operator(.) ident(args)operator_fat(\)) operator_fat(()ident(caddr) operator_fat(()ident(apply) ident(file-parse) ident(path) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_10.0) comment(; Note: Some of the examples will show code blocks in this style:) comment(;) comment(; (define) comment(; ... code here ...) comment(; \)) comment(;) comment(; This is not generally considered good style, and is not recommended;) comment(; it is only used here to more clearly highlight block scope ) comment(; By convention a 'global variable' i.e. a variable that is defined at) comment(; the top-level, and as such, visible within any scope, is named with) comment(; beginning and ending asterisks [and one to be used as a constant) comment(; with beginning and ending plus signs]) operator_fat(()reserved(define) ident(*greeted*) integer(0)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(hello)operator_fat(\)) operator_fat(()reserved(set!) ident(*greeted*) operator_fat(()ident(+) ident(*greeted*) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) string ident(*greeted*) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(how-many-greetings)operator_fat(\)) ident(*greeted*)operator_fat(\)) comment(;; ------------) operator_fat(()ident(hello)operator_fat(\)) operator_fat(()reserved(define) ident(*greetings*) operator_fat(()ident(how-many-greetings)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) string ident(*greetings*) stringoperator_fat(\)) comment(;; @@PLEAC@@_10.1) comment(; Subroutine parameters are named [whether directly, or indirectly in) comment(; the case of variable arguments - see next example]; this is the only) comment(; means of access [This contrasts with languages like Perl and REXX which) comment(; allow access to arguments via array subscripting, and function calls,) comment(; respectively]) operator_fat(()reserved(define) operator_fat(()ident(hypotenuse) ident(side1) ident(side2)operator_fat(\)) operator_fat(()ident(sqrt) operator_fat(()ident(sum) operator_fat(()ident(*) ident(side1) ident(side1)operator_fat(\)) operator_fat(()ident(*) ident(side2) ident(side2)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*diag*) operator_fat(()ident(hypotenuse) integer(3) integer(4)operator_fat(\))operator_fat(\)) comment(;; ----) comment(; 'other-sides' is the name of a list of containing any additional) comment(; parameters. Note that a name is still used to access values) operator_fat(()reserved(define) operator_fat(()ident(hypotenuse) ident(side1) operator(.) ident(other-sides)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(all-sides) operator_fat(()reserved(cons) ident(side1) ident(other-sides)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(side)operator_fat(\)) ident(...)operator_fat(\)) ident(all-sides)operator_fat(\)) ident(...)operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*diag*) operator_fat(()ident(hypotenuse) integer(3) integer(4)operator_fat(\))operator_fat(\)) comment(;; ----) comment(; Possible to pack parameters into a single structure [e.g. list or) comment(; array], and access values contained therein) operator_fat(()reserved(define) operator_fat(()ident(hypotenuse) ident(sides)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(side1) operator_fat(()ident(car) ident(sides)operator_fat(\))operator_fat(\)) operator_fat(()ident(side2) operator_fat(()ident(caar) ident(sides)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(sqrt) operator_fat(()ident(sum) operator_fat(()ident(*) ident(side1) ident(side1)operator_fat(\)) operator_fat(()ident(*) ident(side2) ident(side2)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*args*) operator_fat(')operator_fat(()integer(3) integer(4)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*diag*) operator_fat(()ident(hypotenuse) ident(*args*)operator_fat(\))operator_fat(\)) comment(;; ------------) comment(; Parameters passed by reference, however, whether original object is) comment(; modified depends on choice of functions used to manipulate them) comment(; [most functions create copies and return these; mutating versions of) comment(; same functions may also exist [see next example] ) operator_fat(()reserved(define) ident(*nums*) operator_fat(()ident(vector) integer(1.4) integer(3.5) integer(6.7)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(int-all) ident(vec)operator_fat(\)) operator_fat(()ident(vector-map-in-order) operator_fat(()reserved(lambda) operator_fat(()ident(element)operator_fat(\)) operator_fat(()ident(inexact->exact) operator_fat(()ident(round) ident(element)operator_fat(\))operator_fat(\))operator_fat(\)) ident(vec)operator_fat(\))operator_fat(\)) comment(; Copy created) operator_fat(()reserved(define) ident(*ints*) operator_fat(()ident(int-all) ident(*nums*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*nums*)operator_fat(\)) operator_fat(()ident(print) ident(*ints*)operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*nums*) operator_fat(()ident(vector) integer(1.4) integer(3.5) integer(6.7)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(trunc-all) ident(vec)operator_fat(\)) operator_fat(()ident(array-map-in-order!) operator_fat(()reserved(lambda) operator_fat(()ident(element)operator_fat(\)) operator_fat(()ident(inexact->exact) operator_fat(()ident(round) ident(element)operator_fat(\))operator_fat(\))operator_fat(\)) ident(vec)operator_fat(\))operator_fat(\)) comment(; Original modified) operator_fat(()ident(trunc-all) ident(*nums*)operator_fat(\)) comment(;; @@PLEAC@@_10.2) comment(; Scheme is lexically-scoped; variables defined within a block are) comment(; visible only within that block. Whilst nested / subordinate blocks) comment(; have access to those variables, neither the caller, nor any called) comment(; procedures have direct access to those same variables) operator_fat(()reserved(define) operator_fat(()ident(some-func) ident(parm1) ident(parm2) ident(parm3)operator_fat(\)) ident(...) ident(paramaters) ident(visible) ident(here) ident(...) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(var1) ident(...)operator_fat(\)) operator_fat(()ident(var2) ident(...)operator_fat(\)) operator_fat(()ident(var3) ident(...)operator_fat(\)) ident(...)operator_fat(\)) ident(...) ident(parameters) ident(also) ident(visible) ident(here)error(,) ident(but) ident(variables)error(,) operator_fat(')ident(var1)operator_fat(') ident(etc) ident(only) ident(visible) ident(within) ident(this) ident(block) ident(...) operator_fat(\)) ident(...) ident(paramaters) ident(also) ident(visible) ident(here)error(,) ident(but) ident(still) ident(within) ident(procedure) ident(body) ident(...) operator_fat(\)) comment(;; ------------) comment(; Top-level definitions - accessable globally ) operator_fat(()reserved(define) ident(*name*) operator_fat(()ident(caar) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*age*) operator_fat(()ident(cadr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*start*) operator_fat(()ident(fetch-time)operator_fat(\))operator_fat(\)) comment(;; ----) comment(; Lexical binding - accessable only within this block) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(name) operator_fat(()ident(caar) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(age) operator_fat(()ident(cadr) operator_fat(()ident(command-line)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(start) operator_fat(()ident(fetch-time)operator_fat(\))operator_fat(\))operator_fat(\)) ident(...) ident(variables) ident(only) ident(visible) ident(here) ident(...) operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) ident(*pair*) operator_fat(')operator_fat(()integer(1) operator(.) integer(2)operator_fat(\))operator_fat(\)) comment(; 'a' and 'b' need to be dereferenced and separately defined [Also,) comment(; since globally defined, should really be named, '*a*', '*b*', etc]) operator_fat(()reserved(define) ident(a) operator_fat(()ident(car) ident(*pair*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(b) operator_fat(()ident(cdr) ident(*pair*)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(c) operator_fat(()ident(fetch-time)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(run-check)operator_fat(\)) ident(...) reserved(do) ident(something) ident(with) operator_fat(')ident(a)operator_fat(')error(,) operator_fat(')ident(b)operator_fat(')error(,) reserved(and) operator_fat(')ident(c)operator_fat(') ident(...) operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(check-x) ident(x) ident(y)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(run-check)operator_fat(\)) operator_fat(()ident(print) string ident(x)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Calling 'check-x'; 'run-check' has access to 'a', 'b', and 'c') operator_fat(()ident(check-x) ident(...)operator_fat(\)) comment(;; ----) comment(; If defined within a block, variables 'a', 'b', and 'c' are no longer) comment(; accessable anywhere except that scope. Therefore, 'run-check' as) comment(; defined above can no longer access these variables [in fact, the code) comment(; will fail because variables 'a', 'b', and 'c' do not exist when) comment(; 'run-check' is defined]) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(a) operator_fat(()ident(car) ident(*pair*)operator_fat(\))operator_fat(\)) operator_fat(()ident(b) operator_fat(()ident(cdr) ident(*pair*)operator_fat(\))operator_fat(\)) operator_fat(()ident(c) operator_fat(()ident(fetch-time)operator_fat(\))operator_fat(\))operator_fat(\)) ident(...) operator_fat(()ident(check-x) ident(...)operator_fat(\)) ident(...) operator_fat(\)) comment(;; ----) comment(; The procedures, 'run-check' and 'check-x' are defined within the) comment(; same block as variables, 'a', 'b', and 'c', so have direct access to) comment(; them) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(a) operator_fat(()ident(car) ident(*pair*)operator_fat(\))operator_fat(\)) operator_fat(()ident(b) operator_fat(()ident(cdr) ident(*pair*)operator_fat(\))operator_fat(\)) operator_fat(()ident(c) operator_fat(()ident(fetch-time)operator_fat(\))operator_fat(\)) operator_fat(()ident(run-check) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) ident(...) reserved(do) ident(something) ident(with) operator_fat(')ident(a)operator_fat(')error(,) operator_fat(')ident(b)operator_fat(')error(,) reserved(and) operator_fat(')ident(c)operator_fat(') ident(...)operator_fat(\))operator_fat(\)) operator_fat(()ident(check-x) operator_fat(()reserved(lambda) operator_fat(()ident(x) ident(y)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(run-check)operator_fat(\)) operator_fat(()ident(print) string ident(x)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\)) ident(...) operator_fat(()ident(check-x) ident(...)operator_fat(\)) ident(...) operator_fat(\)) comment(;; @@PLEAC@@_10.3) comment(; Ordinarily, a variable must be initialised when it is defined,) comment(; whether at the top-level: ) operator_fat(()reserved(define) ident(*variable*) integer(1)operator_fat(\)) comment(; ... or within a 'let' binding) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(variable) integer(1)operator_fat(\)) operator_fat(()ident(mysub) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) ident(...) ident(accessing) operator_fat(')ident(variable)operator_fat(') ident(...)operator_fat(\))operator_fat(\))operator_fat(\)) ident(...) reserved(do) ident(stuff) ident(...) operator_fat(\)) comment(; However, since Scheme allows syntactic extensions via 'macros' [of) comment(; which there are two varieties: hygenic and LISP-based], it is) comment(; possible to create new forms which alter this behaviour. For example,) comment(; in this tutorial: http://home.comcast.net/~prunesquallor/macro.txt) comment(; there is a macro implementation equivalent to 'let, 'called,) comment(; 'bind-values', which allows variables to be defined without initial) comment(; values; an example follows:) comment(; Initialisation values for 'a' and 'b' not specified) operator_fat(()ident(bind-values) operator_fat(()operator_fat(()ident(a)operator_fat(\)) ident(b) operator_fat(()ident(c) operator_fat(()ident(+) ident(*global*) integer(5)operator_fat(\))operator_fat(\))operator_fat(\)) ident(...) reserved(do) ident(stuff) ident(...) operator_fat(\)) comment(; In Scheme many things are possible, but not all those things are) comment(; offered as standard features :\) !) comment(;; ------------) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(counter) integer(42)operator_fat(\)) operator_fat(()ident(next-counter) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(set!) ident(counter) operator_fat(()ident(+) ident(counter) integer(1)operator_fat(\))operator_fat(\)) ident(counter)operator_fat(\))operator_fat(\)) operator_fat(()ident(prev-counter) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(set!) ident(counter) operator_fat(()ident(-) ident(counter) integer(1)operator_fat(\))operator_fat(\)) ident(counter)operator_fat(\))operator_fat(\))operator_fat(\)) ident(...) reserved(do) ident(stuff) ident(with) operator_fat(')ident(next-counter)operator_fat(') reserved(and) operator_fat(')ident(prev-counter)operator_fat(') ident(...) operator_fat(\)) comment(;; ----) comment(; A more complete, and practical, variation of the above code:) comment(; 'counter' constructor) operator_fat(()reserved(define) operator_fat(()ident(make-counter) ident(start)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(counter) integer(42)operator_fat(\)) operator_fat(()ident(next-counter) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(set!) ident(counter) operator_fat(()ident(+) ident(counter) integer(1)operator_fat(\))operator_fat(\)) ident(counter)operator_fat(\))operator_fat(\)) operator_fat(()ident(prev-counter) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()reserved(set!) ident(counter) operator_fat(()ident(-) ident(counter) integer(1)operator_fat(\))operator_fat(\)) ident(counter)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(op)operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(eq?) ident(op) operator_fat(')ident(prev)operator_fat(\)) ident(prev-counter)operator_fat(\)) operator_fat(()operator_fat(()ident(eq?) ident(op) operator_fat(')ident(next)operator_fat(\)) ident(next-counter)operator_fat(\)) operator_fat(()ident(else) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(display) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Interface functions to 'counter' functionality) operator_fat(()reserved(define) operator_fat(()ident(prev-counter) ident(counter)operator_fat(\)) operator_fat(()ident(apply) operator_fat(()ident(counter) operator_fat(')ident(prev)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(next-counter) ident(counter)operator_fat(\)) operator_fat(()ident(apply) operator_fat(()ident(counter) operator_fat(')ident(next)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Create a 'counter') operator_fat(()reserved(define) ident(*counter*) operator_fat(()ident(make-counter) integer(42)operator_fat(\))operator_fat(\)) comment(; Use the 'counter' ...) operator_fat(()ident(print) operator_fat(()ident(prev-counter) ident(*counter*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(prev-counter) ident(*counter*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(next-counter) ident(*counter*)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_10.4) comment(; Scheme interpreters generally provide a rich collection of procedure) comment(; metadata, as well as easy access to a program's current 'execution) comment(; state'. Put simply, provision of a powerful, highly customisable) comment(; debugging / tracing facility is almost taken for granted. However, using) comment(; it to perform as trivial a task as obtaining the current function name) comment(; is less than trivial [at least it seems so in Guile] as it appears to) comment(; require quite some setup work. Additionally, the documentation talks) comment(; about facilities e.g. trap installation, that don't appear to be) comment(; available [at least, I couldn't find them].) comment(;) comment(; Example below uses in-built debugging facilities to dump a backtrace) comment(; to a string port and extract the caller's name from the resulting) comment(; string. Not exactly elegant ...) comment(; Execute using: guile --debug ... else no useful output seen) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(debug)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(child) ident(num)operator_fat(\)) comment(; Create stack [i.e. activation record] object, discarding) comment(; irrelevant frames) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(s) operator_fat(()ident(make-stack) pre_constant(#t) integer(3) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(trace-string-port) operator_fat(()ident(open-output-string)operator_fat(\))operator_fat(\)) operator_fat(()ident(parent-name) stringoperator_fat(\))operator_fat(\)) comment(; Dump backtrace to string port) operator_fat(()ident(display-backtrace) ident(s) ident(trace-string-port)operator_fat(\)) comment(; Extract caller's name from backtrace data) comment(; [shamefully crude - don't do this at home !]) operator_fat(()reserved(set!) ident(parent-name) operator_fat(()ident(caddr) operator_fat(()ident(string-tokenize) operator_fat(()ident(cadr) operator_fat(()ident(string-split) operator_fat(()ident(get-output-string) ident(trace-string-port)operator_fat(\)) char(#\\newline)operator_fat(\))operator_fat(\)) ident(char-set:graphic)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Who's your daddy ?) operator_fat(()ident(print) ident(parent-name)operator_fat(\))operator_fat(\))operator_fat(\)) comment(; Each invocation of 'child' should see 'parent' displayed as) comment(; the caller) operator_fat(()reserved(define) operator_fat(()ident(parent)operator_fat(\)) operator_fat(()ident(child) integer(1)operator_fat(\)) operator_fat(()ident(child) integer(2)operator_fat(\)) operator_fat(()ident(child) integer(3)operator_fat(\))operator_fat(\)) operator_fat(()ident(parent)operator_fat(\)) comment(;; @@PLEAC@@_10.5) comment(; Procedure parameters are references to entities, so there is no special) comment(; treatment required. If an argument represents a mutable object such) comment(; as an array, then care should be taken to not mutate the object within) comment(; the procedure, or a copy of the object be made and used) operator_fat(()ident(array-diff) ident(*array1*) ident(*array2*)operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) operator_fat(()ident(add-vector-pair) ident(x) ident(y)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(vector-length) operator_fat(()ident(vector-length) ident(x)operator_fat(\))operator_fat(\)) operator_fat(()ident(new-vec) operator_fat(()ident(make-vector) ident(vector-length)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(let) ident(loop) operator_fat(()operator_fat(()ident(i) integer(0)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(=) ident(i) ident(vector-length)operator_fat(\)) ident(new-vec)operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(vector-set!) ident(new-vec) ident(i) operator_fat(()ident(+) operator_fat(()ident(vector-ref) ident(x) ident(i)operator_fat(\)) operator_fat(()ident(vector-ref) ident(y) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(loop) operator_fat(()ident(+) ident(i) integer(1)operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(define) ident(*a*) operator_fat(')operator_fat(#()integer(1) integer(2)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*b*) operator_fat(')operator_fat(#()integer(5) integer(8)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(*c*) operator_fat(()ident(add-vector-pair) ident(*a*) ident(*b*)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(*c*)operator_fat(\)) comment(;; ----) ident(...) operator_fat(()reserved(if) operator_fat(()reserved(and) operator_fat(()ident(vector?) ident(a1)operator_fat(\)) operator_fat(()ident(vector?) ident(a2)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(add-vector-pair) ident(a1) ident(a2)operator_fat(\))operator_fat(\)) comment(;else) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) ident(...) comment(;; @@PLEAC@@_10.6) comment(; AFAIK there is no Scheme equivalent to Perl's 'return context' where) comment(; it is possible to use language primitives [e.g. 'wantarray'] to ) comment(; dynamically specify the return type of a procedure. It is, however,) comment(; possible to:) comment(; * Return one of several types from a procedure, whether based on ) comment(; processing results [e.g. 'false' on error, numeric on success], or) comment(; perhaps specified via control argument) comment(; * Check procedure return type and take appropriate action) operator_fat(()reserved(define) operator_fat(()ident(my-sub)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(datatype) operator_fat(()ident(vector) operator_fat(')operator_fat(()operator_fat(\)) integer(7) operator_fat(')operator_fat(()integer(1) integer(2) integer(3)operator_fat(\)) string operator_fat(')ident(sym)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(vector-ref) ident(datatype) operator_fat(()ident(random) operator_fat(()ident(vector-length) ident(datatype)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; ----) comment(; '*result*' is bound to a randomly chosen datatype) operator_fat(()reserved(define) ident(*result*) operator_fat(()ident(my-sub)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cond) comment(; It is common to return an empty list to represent 'void') operator_fat(()operator_fat(()ident(null?) ident(*result*)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(list?) ident(*result*)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(number?) ident(*result*)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(string?) ident(*result*)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(symbol?) ident(*result*)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(else) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_10.7) comment(; Keyword parameters are fully supported. Note that pairs have) comment(; replaced Perl strings in the examples since they are easier to) comment(; manipulate) operator_fat(()ident(use-modules) operator_fat(()ident(ice-9) ident(optargs)operator_fat(\))operator_fat(\)) operator_fat(()ident(define*) operator_fat(()ident(the-func) error(#)ident(:key) operator_fat(()ident(increment) operator_fat(()reserved(cons) integer(10) operator_fat(')ident(s)operator_fat(\))operator_fat(\)) operator_fat(()ident(finish) operator_fat(()reserved(cons) integer(0) operator_fat(')ident(m)operator_fat(\))operator_fat(\)) operator_fat(()ident(start) operator_fat(()reserved(cons) integer(0) operator_fat(')ident(m)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(print) ident(increment)operator_fat(\)) operator_fat(()ident(print) ident(finish)operator_fat(\)) operator_fat(()ident(print) ident(start)operator_fat(\))operator_fat(\)) operator_fat(()ident(the-func)operator_fat(\)) operator_fat(()ident(the-func) error(#)ident(:increment) operator_fat(()reserved(cons) integer(20) operator_fat(')ident(s)operator_fat(\)) error(#)ident(:start) operator_fat(()reserved(cons) integer(5) operator_fat(')ident(m)operator_fat(\)) error(#)ident(:finish) operator_fat(()reserved(cons) integer(30) operator_fat(')ident(m)operator_fat(\))operator_fat(\)) operator_fat(()ident(the-func) error(#)ident(:start) operator_fat(()reserved(cons) integer(5) operator_fat(')ident(m)operator_fat(\)) error(#)ident(:finish) operator_fat(()reserved(cons) integer(30) operator_fat(')ident(m)operator_fat(\))operator_fat(\)) operator_fat(()ident(the-func) error(#)ident(:finish) operator_fat(()reserved(cons) integer(30) operator_fat(')ident(m)operator_fat(\))operator_fat(\)) operator_fat(()ident(the-func) error(#)ident(:start) operator_fat(()reserved(cons) integer(5) operator_fat(')ident(m)operator_fat(\)) error(#)ident(:increment) operator_fat(()reserved(cons) integer(20) operator_fat(')ident(s)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_10.8) comment(;; @@INCOMPLETE@@) comment(;; @@INCOMPLETE@@) comment(;; @@PLEAC@@_10.9) comment(; The return of multiple values, whether arrays or other items, may be ) comment(; achieved via:) comment(; * Packaging return items as a single list, structure or array, an) comment(; approach which is usable across many languages, though can be) comment(; clunky because the procedure caller must manually extract all) comment(; items) comment(; * The 'values' procedure, a more Schemish idiom, is usually used in) comment(; conjunction with the 'call-with-values' procedure [the former combines) comment(; multiple values, the latter captures and cleanly extracts them]. It) comment(; comes into its own, however, when used to create a 'macro' [an) comment(; extension to the Scheme language] like 'let-values', a variation of) comment(; the 'let' form that allows multiple return values to be placed directly) comment(; into separate variables. Implementation shown here is from 'The) comment(; Scheme Programming Language, 3rd Edition' by R. Kent Dybvig, though) comment(; there exists a more standard implementation in SRFI-11. There is also) comment(; the 'receive' functionality accessable via: (use-modules (ice-9 receive\)\)) comment(; [1] Implementation of 'somefunc' returning muliple values via packaging) comment(; items within a list that is returned) operator_fat(()reserved(define) operator_fat(()ident(somefunc)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(a) operator_fat(()ident(make-vector) integer(5)operator_fat(\))operator_fat(\)) operator_fat(()ident(h) operator_fat(()ident(make-hash-table) integer(5)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(list) ident(a) ident(h)operator_fat(\)) operator_fat(\))operator_fat(\)) comment(; Retrieving procedure values requires that the return list be captured) comment(; and each contained item separately extracted ['let*' used in place of) comment(; 'let' to ensure correct retrieval order]) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(return-list) operator_fat(()ident(somefunc)operator_fat(\))operator_fat(\)) operator_fat(()ident(a) operator_fat(()ident(car) ident(return-list)operator_fat(\))operator_fat(\)) operator_fat(()ident(b) operator_fat(()ident(cadr) ident(return-list)operator_fat(\))operator_fat(\))operator_fat(\)) ident(...) reserved(do) ident(something) ident(with) operator_fat(')ident(a)operator_fat(') reserved(and) operator_fat(')ident(b)operator_fat(') ident(...)operator_fat(\)) comment(;; ----------------------------) comment(; [2] Implementation of 'somefunc' returning muliple values using the) comment(; 'values' procedure ) operator_fat(()ident(use-syntax) operator_fat(()ident(ice-9) ident(syncase)operator_fat(\))operator_fat(\)) comment(; 'let-values' from: http://www.scheme.com/tspl3/syntax.html#fullletvalues) operator_fat(()reserved(define-syntax) ident(let-values) operator_fat(()ident(syntax-rules) operator_fat(()operator_fat(\)) operator_fat(()operator_fat(()ident(_) operator_fat(()operator_fat(\)) ident(f1) ident(f2) ident(...)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(\)) ident(f1) ident(f2) ident(...)operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(_) operator_fat(()operator_fat(()ident(fmls1) ident(expr1)operator_fat(\)) operator_fat(()ident(fmls2) ident(expr2)operator_fat(\)) ident(...)operator_fat(\)) ident(f1) ident(f2) ident(...)operator_fat(\)) operator_fat(()ident(lvhelp) ident(fmls1) operator_fat(()operator_fat(\)) operator_fat(()operator_fat(\)) ident(expr1) operator_fat(()operator_fat(()ident(fmls2) ident(expr2)operator_fat(\)) ident(...)operator_fat(\)) operator_fat(()ident(f1) ident(f2) ident(...)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define-syntax) ident(lvhelp) operator_fat(()ident(syntax-rules) operator_fat(()operator_fat(\)) operator_fat(()operator_fat(()ident(_) operator_fat(()ident(x1) operator(.) ident(fmls)operator_fat(\)) operator_fat(()ident(x) ident(...)operator_fat(\)) operator_fat(()ident(t) ident(...)operator_fat(\)) ident(e) ident(m) ident(b)operator_fat(\)) operator_fat(()ident(lvhelp) ident(fmls) operator_fat(()ident(x) ident(...) ident(x1)operator_fat(\)) operator_fat(()ident(t) ident(...) ident(tmp)operator_fat(\)) ident(e) ident(m) ident(b)operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(_) operator_fat(()operator_fat(\)) operator_fat(()ident(x) ident(...)operator_fat(\)) operator_fat(()ident(t) ident(...)operator_fat(\)) ident(e) ident(m) ident(b)operator_fat(\)) operator_fat(()ident(call-with-values) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) ident(e)operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(t) ident(...)operator_fat(\)) operator_fat(()ident(let-values) ident(m) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(x) ident(t)operator_fat(\)) ident(...)operator_fat(\)) operator(.) ident(b)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(_) ident(xr) operator_fat(()ident(x) ident(...)operator_fat(\)) operator_fat(()ident(t) ident(...)operator_fat(\)) ident(e) ident(m) ident(b)operator_fat(\)) operator_fat(()ident(call-with-values) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) ident(e)operator_fat(\)) operator_fat(()reserved(lambda) operator_fat(()ident(t) ident(...) operator(.) ident(tmpr)operator_fat(\)) operator_fat(()ident(let-values) ident(m) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(x) ident(t)operator_fat(\)) ident(...) operator_fat(()ident(xr) ident(tmpr)operator_fat(\))operator_fat(\)) operator(.) ident(b)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) operator_fat(()ident(somefunc)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(a) operator_fat(()ident(make-vector) integer(5)operator_fat(\))operator_fat(\)) operator_fat(()ident(h) operator_fat(()ident(make-hash-table) integer(5)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(values) ident(a) ident(h)operator_fat(\)) operator_fat(\))operator_fat(\)) comment(; Multiple return items placed directly into separate variables) operator_fat(()ident(let-values) operator_fat(() operator_fat(()operator_fat(()ident(a) ident(h)operator_fat(\)) operator_fat(()ident(somefunc)operator_fat(\))operator_fat(\)) operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(array?) ident(a)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(hash-table?) ident(h)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_10.10) comment(; Like most modern languages, Scheme supports exceptions for handling) comment(; failure, something that will be illustrated in another section. However,) comment(; conventions exist as to the choice of value used to indicate failure:) comment(; * Empty list i.e. '(\) is often used for this task, as is it's string) comment(; counterpart, "", the empty string) comment(; * Return false i.e. #f to indicate failed / not found etc, and a valid) comment(; value otherwise [e.g. testing set membership: if not a member, return) comment(; #f, but if a member, return the item itself rather than #t]) comment(; Return empty list as indicating 'failure') operator_fat(()reserved(define) operator_fat(()ident(sub-failed)operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) comment(;; ------------) operator_fat(()reserved(define) operator_fat(()ident(look-for-something)operator_fat(\)) ident(...) operator_fat(()reserved(if) operator_fat(()ident(something-found)operator_fat(\)) comment(; Item found, return the item) ident(something) comment(;else) comment(; Not found, indicate failure) pre_constant(#f) operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(look-for-something)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) comment(;else) comment(; do something with item ...) ident(...) comment(;; ------------) comment(; An interesting variation on returning #f as a failure indicator is) comment(; in using the, 'false-if-exception' procedure whereby a procedure is) comment(; executed, any exceptions it may throw caught, and handled by simply) comment(; returning #f. See example in section on Exception Handling below.) comment(;; ------------) operator_fat(()reserved(define) operator_fat(()ident(ioctl)operator_fat(\)) ident(...) pre_constant(#f)operator_fat(\)) operator_fat(()reserved(or) operator_fat(()ident(ioctl)operator_fat(\)) operator_fat(()reserved(begin) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(exit) integer(1)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_10.11) comment(; Whether Scheme is seen to support prototyping depends on the definition) comment(; of this term used:) comment(; * Prototyping along the lines used in Ada, Modula X, and even C / C++,) comment(; in which a procedure's interface is declared separately from its) comment(; implementation, is *not* supported) comment(; * Prototyping in which, as part of the procedure definition, parameter ) comment(; information must be supplied. This is a requirement in Scheme in that) comment(; parameter number and names must be given, though there is no need to) comment(; supply type information [optional and keyword parameters muddy the) comment(; waters somewhat, but the general principle applies]) operator_fat(()reserved(define) operator_fat(()ident(func-with-no-arg)operator_fat(\)) ident(...)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(func-with-one-arg) ident(arg1)operator_fat(\)) ident(...)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(func-with-two-arg) ident(arg1) ident(arg2)operator_fat(\)) ident(...)operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(func-with-three-arg) ident(arg1) ident(arg2) ident(arg3)operator_fat(\)) ident(...)operator_fat(\)) comment(;; @@PLEAC@@_10.12) comment(; Not exactly like the Perl example, but a way of immediately) comment(; exiting from an application) operator_fat(()reserved(define) operator_fat(()ident(die) ident(msg) operator(.) ident(error-code)operator_fat(\)) operator_fat(()ident(display) operator_fat(()ident(string-append) ident(msg) stringoperator_fat(\)) operator_fat(()ident(current-error-port)operator_fat(\))operator_fat(\)) operator_fat(()ident(exit) operator_fat(()reserved(if) operator_fat(()ident(null?) ident(error-code)operator_fat(\)) integer(1) operator_fat(()ident(car) ident(error-code)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()ident(die) stringoperator_fat(\)) comment(;; ------------) comment(; An exception is thrown via 'throw'; argument must be a symbol) operator_fat(()ident(throw) operator_fat(')ident(some-exception)operator_fat(\)) comment(; Invalid attempts - these, themselves force a 'wrong-type-arg) comment(; exception to be thrown) operator_fat(()ident(throw) pre_constant(#t)operator_fat(\)) operator_fat(()ident(throw) stringoperator_fat(\)) operator_fat(()ident(throw) integer(1)operator_fat(\)) comment(;; ------------) comment(; Example of a 'catch all' handler - 'proc' is executed, and any) comment(; exception thrown is handled, in this case by simply returning false) operator_fat(()reserved(define) operator_fat(()ident(false-if-exception) ident(proc)operator_fat(\)) operator_fat(()ident(catch) pre_constant(#t) ident(proc) operator_fat(()reserved(lambda) operator_fat(()ident(key) operator(.) ident(args)operator_fat(\)) pre_constant(#f)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(func)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(throw) operator_fat(')ident(myexception) integer(1)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) comment(;; ----) operator_fat(()reserved(if) operator_fat(()ident(not) operator_fat(()ident(false-if-exception) ident(main)operator_fat(\))operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) comment(;; ------------) comment(; More typical exception handling example in which:) comment(; * 'func' is executed) comment(; * 'catch' either:) comment(; - returns return value of 'func' [if successful]) comment(; - executes handler(s\)) operator_fat(()reserved(define) operator_fat(()ident(full-moon-exception-handler) ident(key) operator(.) ident(args)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(full-moon-exception-prewind-handler) ident(key) operator(.) ident(args)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(func)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\)) operator_fat(()ident(throw) operator_fat(')ident(full-moon-exception) integer(1)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(catch) operator_fat(')ident(full-moon-exception) ident(func) ident(full-moon-exception-handler) ident(full-moon-exception-prewind-handler)operator_fat(\)) comment(;; @@PLEAC@@_10.13) comment(; Scheme is lexically-scoped, so same-name, higher-level variables) comment(; are merely shadowed in lower-level blocks. Upon exit from those) comment(; blocks the higher-level values are again available. Therefore, the) comment(; saving of global variables, as required by Perl, is not necessary) comment(; Global variable) operator_fat(()reserved(define) ident(age) integer(18)operator_fat(\)) comment(; Procedure definition creates a closure - it captures the earlier) comment(; version of, age', and will retain it) operator_fat(()reserved(define) operator_fat(()ident(func)operator_fat(\)) operator_fat(()ident(print) ident(age)operator_fat(\))operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(condition)operator_fat(\)) comment(; New 'local' variable created which acts to shadow the global) comment(; version) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(age) integer(23)operator_fat(\))operator_fat(\)) comment(; Prints 23 because the global variable is shadowed within ) comment(; this block ) operator_fat(()ident(print) ident(age)operator_fat(\)) comment(; However, lexical-scoping ensures 'func' still accesses the) comment(; 'age' which was active when it was defined) operator_fat(()ident(func)operator_fat(\)) operator_fat(\))operator_fat(\)) comment(; The use of 'fluid-let' allows for similar behaviour to Perl's i.e.) comment(; it mimics dynamic scope, but it does so cleanly in that once its) comment(; scope ends any affected global variables are restored to previous) comment(; values) operator_fat(()reserved(if) operator_fat(()ident(condition)operator_fat(\)) comment(; This does not create a new 'local' variables but temporarily) comment(; sets the global variable, 'age' to 23) operator_fat(()ident(fluid-let) operator_fat(()operator_fat(()ident(age) integer(23)operator_fat(\))operator_fat(\)) comment(; Prints 23 because it is accessing the global version of 'age') operator_fat(()ident(print) ident(age)operator_fat(\)) comment(; Prints 23 because it is its lexically-scoped version of 'age') comment(; that has its value altered, albeit temporarily) operator_fat(()ident(func)operator_fat(\)) operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_10.14) comment(; Define two procedures, bind them to identifiers) operator_fat(()reserved(define) operator_fat(()ident(grow)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(shrink)operator_fat(\)) operator_fat(()ident(print) stringoperator_fat(\))operator_fat(\)) comment(; Separate procedures executed) operator_fat(()ident(grow)operator_fat(\)) operator_fat(()ident(shrink)operator_fat(\)) comment(; Rebind identifier; now acts as alias for latter) operator_fat(()reserved(define) ident(grow) ident(shrink)operator_fat(\)) comment(; Same procedure executed in both cases) operator_fat(()ident(grow)operator_fat(\)) operator_fat(()ident(shrink)operator_fat(\)) comment(;; ------------) comment(; As for previous except that rebinding is localised and) comment(; ends once local scope exited) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(grow) ident(shrink)operator_fat(\))operator_fat(\)) operator_fat(()ident(grow)operator_fat(\)) operator_fat(()ident(shrink)operator_fat(\))operator_fat(\)) comment(;; ----------------------------) comment(; Example of dynamically creating [from text data] and binding) comment(; procedures. The example here is conceptually similar to the Perl) comment(; example in that it makes use of an 'eval' type of facility to) comment(; generate code from text. In Scheme such tasks are generally better) comment(; dealt with using macros ) comment(; List of procedure name / first argument pairs) operator_fat(()reserved(define) ident(*colours*) operator_fat(()ident(list) operator_fat(')operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(')operator_fat(()string operator(.) stringoperator_fat(\)) operator_fat(\))operator_fat(\)) comment(; Build a series of procedures dynamically by traversing the) comment(; *colours* list and obtaining:) comment(; * Procedure name from first item of pair) comment(; * Procedure argument from second item of pair) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(colour)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(proc-string) operator_fat(()ident(string-append) string operator_fat(()ident(car) ident(colour)operator_fat(\)) string string operator_fat(()ident(car) ident(colour)operator_fat(\)) string)delimiter(")> operator_fat(()ident(cdr) ident(colour)operator_fat(\)) string)content(\\")content(\)\))delimiter(")> operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(eval-string) ident(proc-string)operator_fat(\))operator_fat(\))operator_fat(\)) ident(*colours*)operator_fat(\)) comment(; Apply each of the dynamically-built procedures) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(colour)operator_fat(\)) operator_fat(()ident(print) operator_fat(()ident(apply) operator_fat(()ident(string->procedure) operator_fat(()ident(car) ident(colour)operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) ident(*colours*)operator_fat(\)) comment(;; @@PLEAC@@_10.15) comment(; AFAICT Guile doesn't implement an AUTOLOAD facility in which a) comment(; 'replacement' function is available should another one fail to) comment(; load [though there is an autoload feature available with modules) comment(; which is a load-on-demand facility aimed at conserving memory and) comment(; speeding up initial program load time].) comment(;) comment(; One might think it would be feasable, however, to use exception) comment(; handling to provide roughly similar functionality:) comment(; Catch all exceptions) operator_fat(()ident(catch) pre_constant(#t) comment(; Undefined procedure, 'x') ident(x) comment(; Exception handler could load missing code ?) operator_fat(()reserved(lambda) operator_fat(()ident(key) operator(.) ident(args)operator_fat(\)) ident(...) operator_fat(\))operator_fat(\)) comment(; However, an undefined function call is reported as:) comment(;) comment(; ERROR: Unbound variable: ...) comment(;) comment(; and this situation doesn't appear to be user-trappable. ) comment(;) comment(;; @@PLEAC@@_10.16) comment(; Both implementations below are correct, and exhibit identical) comment(; behaviour ) operator_fat(()reserved(define) operator_fat(()ident(outer) ident(arg)operator_fat(\)) operator_fat(()reserved(let*) operator_fat(()operator_fat(()ident(x) operator_fat(()ident(+) ident(arg) integer(35)operator_fat(\))operator_fat(\)) operator_fat(()ident(inner) operator_fat(()reserved(lambda) operator_fat(()operator_fat(\)) operator_fat(()ident(*) ident(x) integer(19)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(+) ident(x) operator_fat(()ident(inner)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; ----------------------------) operator_fat(()reserved(define) operator_fat(()ident(outer) ident(arg)operator_fat(\)) operator_fat(()reserved(let) operator_fat(()operator_fat(()ident(x) operator_fat(()ident(+) ident(arg) integer(35)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(inner)operator_fat(\)) operator_fat(()ident(*) ident(x) integer(19)operator_fat(\))operator_fat(\)) operator_fat(()ident(+) ident(x) operator_fat(()ident(inner)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_10.17) comment(;; @@INCOMPLETE@@) comment(;; @@INCOMPLETE@@) comment(;; @@PLEAC@@_13.0) comment(;; Guile OOP is in the (oop goops\) module (based on CLOS\). All) comment(;; following sections assume you have (oop goops loaded\).) operator_fat(()ident(use-modules) operator_fat(()ident(oop) ident(goops)operator_fat(\))operator_fat(\)) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(obj) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(obj) operator_fat(#()integer(3) integer(5)operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(class-of) ident(obj)operator_fat(\)) operator_fat(()ident(array-ref) ident(obj) integer(1)operator_fat(\))operator_fat(\)) operator_fat(()ident(change-class) ident(v) ident()operator_fat(\)) comment(; has to be defined) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(slot-ref) ident(obj) ident(stomach)operator_fat(\)) operator_fat(()ident(slot-ref) ident(obj) ident(name)operator_fat(\))operator_fat(\)) operator_fat(()ident(slot-ref) ident(obj) operator_fat(')ident(stomach)operator_fat(\)) operator_fat(()ident(slot-set!) ident(obj) operator_fat(')ident(stomach) stringoperator_fat(\)) operator_fat(()ident(name) ident(obj)operator_fat(\)) operator_fat(()reserved(set!) operator_fat(()ident(name) ident(obj)operator_fat(\)) stringoperator_fat(\)) comment(;; inheritance) operator_fat(()ident(define-class) ident() operator_fat(()ident()operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(lector) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()ident(feed) ident(lector) stringoperator_fat(\)) operator_fat(()ident(move) ident(lector) stringoperator_fat(\)) comment(;; @@PLEAC@@_13.1) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\)) operator_fat(()ident(start) error(#)ident(:init-form) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\)) operator_fat(()ident(age) error(#)ident(:init-value) integer(0)operator_fat(\))operator_fat(\)) comment(;; classes must have predefined slots, but you could use one as a) comment(;; dictionary:) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\)) operator_fat(()ident(start) error(#)ident(:init-form) operator_fat(()ident(current-time)operator_fat(\))operator_fat(\)) operator_fat(()ident(age) error(#)ident(:init-value) integer(0)operator_fat(\)) operator_fat(()ident(properties) error(#)ident(:init-value) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) operator_fat(()ident(initialize) operator_fat(()ident(m) ident()operator_fat(\)) ident(initargs)operator_fat(\)) operator_fat(()ident(and-let*) operator_fat(()operator_fat(()ident(extra) operator_fat(()ident(memq) error(#)ident(:extra) ident(initargs)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(slot-set!) ident(m) operator_fat(')ident(properties) operator_fat(()ident(cdr) ident(extra)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_13.2) comment(;; For smobs (external C objects\), you can specify a callback to be) comment(;; performed when the object is garbage collected with the C API) comment(;; function `scm_set_smob_free'. This solves the problem of cleaning up) comment(;; after external objects and connections. Guile doesn't use reference) comment(;; count garbage collection, so circular data structures aren't a) comment(;; problem.) comment(;; @@PLEAC@@_13.3) comment(;; either use slot-ref/set!) operator_fat(()ident(slot-ref) ident(obj) operator_fat(')ident(name)operator_fat(\)) operator_fat(()ident(slot-set!) ident(obj) operator_fat(')ident(name) ident(value)operator_fat(\)) comment(;; or define the class with accessors) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\)) operator_fat(()ident(name) error(#)ident(:accessor) ident(name)operator_fat(\))operator_fat(\)) operator_fat(()ident(name) ident(obj)operator_fat(\)) operator_fat(()reserved(set!) operator_fat(()ident(name) ident(obj)operator_fat(\)) ident(value)operator_fat(\)) comment(;; or use getters/setters to implement read/write-only slots) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\)) operator_fat(()ident(name) error(#)ident(:getter) ident(name)operator_fat(\)) operator_fat(()ident(age) error(#)ident(:setter) ident(age)operator_fat(\))operator_fat(\)) operator_fat(()ident(name) ident(obj)operator_fat(\)) operator_fat(()reserved(set!) operator_fat(()ident(age) ident(obj)operator_fat(\)) ident(value)operator_fat(\)) comment(;; or implement getters/setters manually) operator_fat(()ident(define-method) operator_fat(()operator_fat(()ident(setter) ident(name)operator_fat(\)) operator_fat(()ident(obj) ident()operator_fat(\)) ident(value)operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(string-match) string ident(value)operator_fat(\)) operator_fat(()ident(warn) stringoperator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(string-match) string ident(value)operator_fat(\)) operator_fat(()ident(warn) stringoperator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(string-match) string ident(value)operator_fat(\))operator_fat(\)) operator_fat(()ident(warn) stringoperator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(string-match) string ident(value)operator_fat(\))operator_fat(\)) operator_fat(()ident(warn) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(slot-set!) ident(obj) operator_fat(')ident(name) operator_fat(()ident(string-downcase) ident(value)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_13.4) comment(;; override the initialize method) operator_fat(()reserved(define) ident(body-count) integer(0)operator_fat(\)) operator_fat(()ident(define-method) operator_fat(()ident(initialize) operator_fat(()ident(obj) ident()operator_fat(\)) ident(initargs)operator_fat(\)) operator_fat(()reserved(set!) ident(body-count) operator_fat(()integer(1)ident(+) ident(body-count)operator_fat(\))operator_fat(\)) operator_fat(()ident(next-method)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(people) operator_fat(')operator_fat(()operator_fat(\))operator_fat(\)) operator_fat(()reserved(do) operator_fat(()operator_fat(()ident(i) integer(1) operator_fat(()integer(1)ident(+) ident(i)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(>) ident(i) integer(10)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) ident(people) operator_fat(()reserved(cons) operator_fat(()ident(make) ident()operator_fat(\)) ident(people)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string ident(body-count)operator_fat(\)) operator_fat(()reserved(define) ident(him) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()ident(slot-set!) ident(him) operator_fat(')ident(gender) stringoperator_fat(\)) operator_fat(()reserved(define) ident(her) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()ident(slot-set!) ident(her) operator_fat(')ident(gender) stringoperator_fat(\)) comment(;; use the :class allocation method) operator_fat(()ident(slot-set!) operator_fat(()ident(make) ident()operator_fat(\)) operator_fat(')ident(max-bounds) integer(100)operator_fat(\)) comment(; set for whole class) operator_fat(()reserved(define) ident(alpha) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(slot-ref) ident(alpha) operator_fat(')ident(max-bounds)operator_fat(\))operator_fat(\)) comment(;; 100) operator_fat(()reserved(define) ident(beta) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()ident(slot-set!) ident(beta) operator_fat(')ident(max-bounds) integer(50)operator_fat(\)) comment(; still sets for whole class) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(slot-ref) ident(alpha) operator_fat(')ident(max-bounds)operator_fat(\))operator_fat(\)) comment(;; 50) comment(;; defined simply as) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\)) operator_fat(()ident(max-bounds) error(#)ident(:init-value) integer(7) error(#)ident(:allocation) error(#)ident(:class)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_13.5) comment(;; Guile classes are basically structs by definition. If you don't care) comment(;; about OO programming at all, you can use records, which are portable) comment(;; across most Schemes. This is, however, an OO chapter so I'll stick) comment(;; to classes.) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\)) ident(name) ident(age) ident(peers)operator_fat(\)) operator_fat(()reserved(define) ident(p) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()ident(slot-set!) ident(p) operator_fat(')ident(name) stringoperator_fat(\)) operator_fat(()ident(slot-set!) ident(p) operator_fat(')ident(age) integer(13)operator_fat(\)) operator_fat(()ident(slot-set!) ident(p) operator_fat(')ident(peers) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(slot-ref) ident(p) operator_fat(')ident(age)operator_fat(\)) operator_fat(()ident(slot-ref) ident(p) operator_fat(')ident(name)operator_fat(\)) operator_fat(()ident(car) operator_fat(()ident(slot-ref) ident(p) operator_fat(')ident(peers)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; For type-checking and field validation, define the setters) comment(;; accordingly.) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\)) operator_fat(()ident(name) error(#)ident(:accessor) ident(name)operator_fat(\)) operator_fat(()ident(age) error(#)ident(:accessor) ident(age)operator_fat(\))operator_fat(\)) operator_fat(()ident(define-method) operator_fat(()operator_fat(()ident(setter) ident(age)operator_fat(\)) operator_fat(()ident(p) ident()operator_fat(\)) ident(a)operator_fat(\)) operator_fat(()reserved(cond) operator_fat(()operator_fat(()ident(not) operator_fat(()ident(number?) ident(a)operator_fat(\))operator_fat(\)) operator_fat(()ident(warn) string ident(a) stringoperator_fat(\))operator_fat(\)) operator_fat(()operator_fat(()ident(>) ident(a) integer(150)operator_fat(\)) operator_fat(()ident(warn) string ident(a) stringoperator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(slot-set!) ident(p) operator_fat(')ident(age) ident(a)operator_fat(\))operator_fat(\)) operator_fat(()ident(define-class) ident() operator_fat(()operator_fat(\)) operator_fat(()ident(head) error(#)ident(:init-form) operator_fat(()ident(make) ident()operator_fat(\)) error(#)ident(:accessor) ident(head)operator_fat(\)) operator_fat(()ident(address) error(#)ident(:init-value) string error(#)ident(:accessor) ident(address)operator_fat(\)) operator_fat(()ident(members) error(#)ident(:init-value) operator_fat(')operator_fat(()operator_fat(\)) error(#)ident(:accessor) ident(members)operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(folks) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(dad) operator_fat(()ident(head) ident(folks)operator_fat(\))operator_fat(\)) operator_fat(()reserved(set!) operator_fat(()ident(name) ident(dad)operator_fat(\)) stringoperator_fat(\)) operator_fat(()reserved(set!) operator_fat(()ident(age) ident(dad)operator_fat(\)) integer(34)operator_fat(\)) operator_fat(()ident(format) pre_constant(#t) string operator_fat(()ident(name) ident(dad)operator_fat(\)) operator_fat(()ident(age) ident(dad)operator_fat(\))operator_fat(\)) comment(;; Macros are the usual way to add syntactic sugar) comment(;; For all fields of the same type, let's use _ to mean the slot name in) comment(;; the options expansion.) operator_fat(()ident(define-macro) operator_fat(()ident(define-uniform-class) ident(name) ident(supers) ident(slots) operator(.) ident(options)operator_fat(\)) error(`)operator_fat(()ident(define-class) error(,)ident(name) error(,)ident(supers) error(,)ident(@)operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(s)operator_fat(\)) operator_fat(()reserved(cons) ident(s) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(o)operator_fat(\)) operator_fat(()reserved(if) operator_fat(()ident(eq?) ident(o) operator_fat(')ident(_)operator_fat(\)) ident(s) ident(o)operator_fat(\))operator_fat(\)) ident(options)operator_fat(\))operator_fat(\))operator_fat(\)) ident(slots)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(define-uniform-class) ident() operator_fat(()ident(name) ident(color) ident(cost) ident(type) ident(release) ident(text)operator_fat(\)) error(#)ident(:accessor) ident(_) error(#)ident(:init-value) stringoperator_fat(\)) comment(;; If you *really* wanted to enforce slot types you could use something) comment(;; like the above with the custom setter. To illustrate reversing) comment(;; normal slot definition args, we'll reverse an init-value:) operator_fat(()ident(define-macro) operator_fat(()ident(define-default-class) ident(name) ident(supers) operator(.) ident(default&slots)operator_fat(\)) error(`)operator_fat(()ident(define-class) error(,)ident(name) error(,)ident(supers) error(,)ident(@)operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(d&s)operator_fat(\)) operator_fat(()ident(list) operator_fat(()ident(cadr) ident(d&s)operator_fat(\)) error(#)ident(:init-value) operator_fat(()ident(car) ident(d&s)operator_fat(\)) error(#)ident(:accessor) operator_fat(()ident(cadr) ident(d&s)operator_fat(\))operator_fat(\))operator_fat(\)) ident(default&slots)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(define-default-class) ident(hostent) operator_fat(()operator_fat(\)) operator_fat(()string ident(name)operator_fat(\)) operator_fat(()operator_fat(')operator_fat(()operator_fat(\)) ident(aliases)operator_fat(\)) operator_fat(()string ident(addrtype)operator_fat(\)) operator_fat(()integer(0) ident(length)operator_fat(\)) operator_fat(()operator_fat(')operator_fat(()operator_fat(\)) ident(addr-list)operator_fat(\))operator_fat(\)) comment(;; Nothing special needed for Aliases - all names are equal) operator_fat(()reserved(define) ident(type) ident(addrtype)operator_fat(\)) operator_fat(()ident(define-method) operator_fat(()ident(addr) operator_fat(()ident(h) ident()operator_fat(\))operator_fat(\)) operator_fat(()ident(car) operator_fat(()ident(addr-list) ident(h)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_13.6) comment(;; A little more clear than the Perl, but not very useful.) operator_fat(()reserved(define) ident(obj1) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(obj2) operator_fat(()ident(make) operator_fat(()ident(class-of) ident(obj1)operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; Use the shallow-clone or deep-clone methods to initialize from) comment(;; another instance.) operator_fat(()reserved(define) ident(obj1) operator_fat(()ident(make) ident()operator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(obj2) operator_fat(()ident(deep-clone) ident(obj1)operator_fat(\))operator_fat(\)) comment(;; @@PLEAC@@_13.7) comment(;; Use eval or a variant to convert from a symbol or string to the) comment(;; actual method. As shown in 13.5 above, methods are first class and) comment(;; you'd be more likely to store the actual method than the name in a) comment(;; real Scheme program.) operator_fat(()reserved(define) ident(methname) stringoperator_fat(\)) operator_fat(()ident(apply-generic) operator_fat(()ident(eval-string) ident(methname)operator_fat(\)) ident(obj) integer(10)operator_fat(\)) operator_fat(()ident(for-each) operator_fat(()reserved(lambda) operator_fat(()ident(m)operator_fat(\)) operator_fat(()ident(apply-generic) ident(obj) operator_fat(()ident(eval-string) ident(m)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) comment(;; really, don't do this...) operator_fat(()reserved(define) ident(methods) operator_fat(')operator_fat(()string string stringoperator_fat(\))operator_fat(\)) operator_fat(()reserved(define) ident(his-info) operator_fat(()ident(map) operator_fat(()reserved(lambda) operator_fat(()ident(m)operator_fat(\)) operator_fat(()reserved(cons) ident(m) operator_fat(()ident(apply-generic) operator_fat(()ident(eval-string) ident(m)operator_fat(\)) ident(obj)operator_fat(\))operator_fat(\))operator_fat(\)) ident(methods)operator_fat(\))operator_fat(\)) comment(;; same as this:) operator_fat(()reserved(define) ident(his-info) operator_fat(()ident(list) operator_fat(()reserved(cons) string operator_fat(()ident(name) ident(obj)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cons) string operator_fat(()ident(rank) ident(obj)operator_fat(\))operator_fat(\)) operator_fat(()reserved(cons) string operator_fat(()ident(serno) ident(obj)operator_fat(\))operator_fat(\))operator_fat(\))operator_fat(\)) comment(;; a closure works) operator_fat(()reserved(define) ident(fnref) operator_fat(()reserved(lambda) ident(args) operator_fat(()ident(method) ident(obj) ident(args)operator_fat(\))operator_fat(\))operator_fat(\)) operator_fat(()ident(fnref) integer(10) stringoperator_fat(\)) operator_fat(()ident(method) ident(obj) integer(10) ident(fred)operator_fat(\)) comment(;; @@PLEAC@@_13.8) comment(;; use is-a?) operator_fat(()ident(is-a?) ident(obj) ident()operator_fat(\)) operator_fat(()ident(is-a?) ident() ident()operator_fat(\))