NEWS for ttn-pers-scheme - 0.50 | 2008-03-16 - License now GPLv3+ (see COPYING) - Dropped (ttn html-world) procs: render-html-world, html-world These were announced in release 0.48 (2007-04-07). - Dropped module: (ttn METAINFO) This was introduced in release 0.33 (2004-01-30), but proved to be useless. Sorry, no pre-announcement (see "Imminent retirement" below). - Bugfix: (ttn listener) make-listener regression A bug was introduced in ttn-pers-scheme 0.18 (2001-04-09) whereby the variable holding the current connection socket was accessed out of scope. Caught by "guile-tools lint". - New configure check: (ice-9 optargs-kw) proc `remove-keys' This proc originated from module (ttn optargs-kw-utils). - Benchmarks back It's been several years since benchmarks were run, partly due to slow hardware (200MHz Pentium Pro, 300MHz Openbrick) and twitchy release fingers. Now the infrastructure has been spruced up and the files benchmarks/tea-{0.1,2.0} are again being distributed. Default iterations bumped 10x for 10 years of progress... :-/ Note: These files will probably not be updated on every release. - Imminent retirement As of this release, ttn-pers-scheme is heading towards retirement. This means useful functionality has been migrated elsewhere and that after 2008-12-31, the package will no longer be available. See "Future" in the documentation for details. - 0.49 | 2007-04-09 - Changes to module (ttn markup) - New proc: symbol<-kw/sym - New proc: string<-kw/sym - New proc: css-tree Might as well put these common operations here. - New parameter to `expand': #:xbsc Aka "XMLish (blech) start close". Really: "blech!" - New (ttn flatten) proc: flatten-to - New module: (ttn html-data2) For XHTML 1.0 generation. - 0.48 | 2007-04-07 - After DATE, THING will be removed; DO NOT rely on it - 2007-10-15: proc `(ttn html-world) render-html-world' - 2008-04-15: proc `(ttn html-world) html-world' You can use `html-world.html-data' (cleaner, more general). - Dropped module: (ttn echo) - Dropped module: (ttn stringutils) These were announced in release 0.44 (2005-09-04). - Dropped (ttn abbrev-tree) proc: scrub - Dropped (ttn abbrev-tree) proc: split-first-word - Dropped (ttn abbrev-tree) proc: list->sep-string These were announced (in the manual but not in NEWS -- oops!) in release 0.43 (2005-08-20). - Dropped module: (ttn moduleutils) - Dropped feature: quoting support in `read-text-db-table' These were announced in release 0.42 (2005-06-05). - Changes to module (ttn html-world) - External program no longer needed: mogrify(1) This is part of the package `ImageMagick' and was used to invert a ppm image . Now, this is done with another external program, pnminvert(1), part of the package `Netpbm'. See modules.af for a full list. - New #:gen method: #:ppmforge This uses ppmforge(1) with options `-quiet -stars 0' to create the ppm image. A large majority of the time, the image does not correspond to any landmass found on Earth, but sometimes a vague similarity occurs. The #:ppmforge method is now the default for `html-world' and `html-world.html-data'. - New keyword arg for `html-world.html-data': #:link-tree Normally, the proc `href' from module (ttn html-data) is used to construct the tree (nested list of strings) that represents a chunk of text that is to be marked up w/ an HTML tag. This option lets you use another proc. - New proc: string<-image-command - New proc: randomly-hyperlinked These are the underlying mechanisms in `html-world.html-data', now generalized and documented. Let the madness begin... - Optimization: `flatten' does nothing for the null string - New (ttn html-data) procs: link tt, pre, div, span - New keyword for `listener': #:catch-tag SYMBOL - New (ttn dirutils) macro: with-cwd - New (ttn shell-command-to-string) proc: file-lines - New (ttn sanity) proc: ppsrc - New module: (ttn markup) Procedures in this module support definition of markup languages and related tree (nested list of strings) construction. Flatten the trees to get the grotty BODY stuff. - New homepage: http://www.gnuvola.org/software/ttn-pers-scheme/ Please update your bookmarks. Old glug.org urls can be munged to get the new url by passing them through: sed 's,/people/ttn/,/,;s,/ps/,/ttn-pers-scheme/,' Note: old urls in NEWS will remain unchanged, intentionally. - 0.47 | 2006-07-22 - Dropped (ttn rcsutils) proc: group-files-by-rcs-state - Dropped (ttn cvsutils) proc: group-files-by-cvs-state This was announced in release 0.46 (2006-02-23). You can replace these procs, both of which take list FILES, with: (group-logs-by 'state (map rlog FILES)) and (group-logs-by 'state (map cvslog FILES)) respectively. - Dropped module: (ttn split-mbox) - Dropped module: (ttn flatten-to-buffer) - Dropped module: (ttn find-file) - Dropped module: (ttn write-buffer) - Dropped module: (ttn write-buffer-if-changed) - Dropped module: (ttn save-buffer) This was announced in release 0.46 (2006-02-23). Except for the first one, functionality has moved to (ttn bufutils). - Dropped module: (ttn slice) - Dropped module: (ttn edit) This was announced in release 0.42 (2005-06-05). You can get (ttn edit) functionality from module (ice-9 editing-buffer). - Dropped module: (ttn defvar) This was announced in release 0.38 (2004-12-03). - Bugfix: (ttn rw-vcg) procs can handle `classname' and `infoname' These attributes are now transformed so that the integer between the attribute name and the colon is made into the first element of the attribute value (a list). For example: vcg file text: infoname 2 : "good stuff" internal rep: #:infoname (2 "good stuff") Previously, parsing would simply fail (with error) on such text. Also, reading can now handle a space between the attribute name and the colon. The module still needs better testing (as well as a proper implementation that doesn't rely on sed(1)!). - 0.46 | 2006-02-23 - No longer maintained, to be dropped after 2006-05-31 - module (ttn split-mbox) - module (ttn flatten-to-buffer) ;; see (ttn bufutils) - module (ttn find-file) ;; likewise - module (ttn write-buffer) ;; likewise - module (ttn write-buffer-if-changed) ;; likewise - module (ttn save-buffer) ;; likewise - `group-files-by-rcs-state' from module (ttn rcsutils) - `group-files-by-cvs-state' from module (ttn cvsutils) - More slackful (ttn html-data) procs The following procs now take any number of args, not just a single arg: h1, h2, h3, h4, h5, h6, b, li, table, tr, td. This means you can write, e.g., `(table (tr (td ...) ...))' instead of `(table (list (tr (list (td ...) ...)) ...))'. - New (ttn rlog-scan-proc) proc: group-logs-by - New module: (ttn bufutils) - Info page index unified (from three to one) - 0.45 | 2006-01-30 - Dropped module: (ttn collect-files-sorted-by-mtime) - Dropped module: (ttn display-table) These were declared "no longer maintained" in release 0.44 (2005-09-04) and 0.38 (2004-12-03), respectively. - Changes to (ttn cvsutils) - Bugfix: Export `group-files-by-cvs-state' - Update parsing to handle date format from recentish "cvs log" With CVS 1.12.9, the dates output from a "cvs log" command differ slightly from the classic RCS "YYYY/MM/DD HH:MM:SS" format. Parsing now handles the new date format, i.e., "YYYY-MM-DD HH:MM:SS ZZZZZ", as well as the old. The timezone portion ZZZZZ is discarded. - 0.44 | 2005-09-04 - Dropped module: (ttn pgtype) -- see NEWS 0.37 (2004-08-05) entry - Dropped module: (ttn pgtable) -- likewise - Dropped module: (ttn pgmeta) -- likewise - Module no longer maintained: (ttn collect-files-sorted-by-mtime) - Module no longer maintained: (ttn echo) - Module no longer maintained: (ttn stringutils) - New (ttn html-data) proc: smhdwy-since - Extension to proc `read-text-db-table': flags Flag #:list means return each record as a list instead of as an alist (the default). Flag #:closure means return each record as a closure (procedure) that accepts one arg SEL. If #:list is also specified, SEL is a 0-based integer to index into the record's data. Otherwise, SEL names a field in the record's data. - New (ttn email-log-if-fail) proc: set-system-mail-program! - 0.43 | 2005-08-20 - Dropped module: (ttn ftw) -- see NEWS 0.30 (2002-08-13) entry - Dropped module: (ttn eformat) -- 0.38 (2004-12-03) - Dropped module: (ttn gap-buffer) -- 0.37 (2004-08-05) - Configuration change The "configure" script no longer checks that module (guile-user) exports proc `eval-in-module'. This proc is now accessed via loading module (ice-9 gumm). - Extension to proc `filtered-files-in-vicinity' This proc now takes options, in the form of additional keyword flags, that modify the default behavior: #:filter-prefixed -- Pass to the filter proc each filename with the directory already prefixed. #:collect-nodir -- When the filter proc returns #t, collect the filename without the directory prefix. These options encapsulate common post-processing operations and can be used singly or together (or omitted entirely). - Extension to proc `read-text-db-table' - New (ttn read-text-db-table) proc: text-db-table-meta The text db table format now can include meta info: (text-db-table-config (meta . META) ; optional; META is opaque, default #f (delim . "\f") (fields (NAME1 TYPE1) (NAME2 TYPE2) ...)) The new object property `text-db-table-meta' (procedure with setter) can be used to access/modify the META associated with the list of records returned by `read-text-db-table'. - Extensions to proc `make-listener' First arg can now be a list of `bind' arguments, instead of an integer. For backward compatability, an integer is taken to specify a TCP/IP port, in which case the family is `AF_INET' and the address is `INADDR_ANY'. For example, these are identical: (make-listener 23456) === (make-listener (list AF_INET INADDR_ANY 23456)) Here is an example of specifying a socket on the filesystem: (make-listener (list AF_UNIX "/tmp/sockfile")) Additionally, `make-listener' now accepts keyword option #:concurrency with value #:coop-thread, which means dispatch each child in its own thread; or #f (the default), which means dispatch and wait for each child to finish serially. - Extension to `grep' and `grep-matches' The flags that modify the default behavior for these procs may now be keywords. (Symbols are ok, too, as before.) - New (ttn dirutils) proc: file-newer-than-file? - 0.42 | 2005-06-05 - Module no longer maintained: (ttn moduleutils) - Module no longer maintained: (ttn slice) - Module no longer maintained: (ttn edit) - Quoting no longer required for text db table specifcation Formerly, a text db table spec required quotes, like so: (text-db-table-config '(delim . "\f") '(fields (NAME1 TYPE1) (NAME2 TYPE2) ...)) Now, the quotes are no longer required: (text-db-table-config (delim . "\f") (fields (NAME1 TYPE1) (NAME2 TYPE2) ...)) For backward compatability, quotes are still accepted for the time being; that support will be dropped at some point. - New (ttn cron) macro: cron! - 0.41 | 2005-04-03 - Changes to (ttn sgf) - Dropped proc: display-in-emacs-syntax This was a provisionary proc useful in the period before SGF read/write support appeared in gnugo.el 2.2.10: http://www.glug.org/people/ttn/software/personal-elisp/standalone/ - Property `GM' range extended to 20 The `GM' property specifies the type of game tree(s) encoded in an SGF file. The SGF[4] specification says: Valid numbers are: Go = 1, Othello = 2, chess = 3, Gomoku+Renju = 4, Nine Men's Morris = 5, Backgammon = 6, Chinese chess = 7, Shogi = 8, Lines of Action = 9, Ataxx = 10, Hex = 11, Jungle = 12, Neutron = 13, Philosopher's Football = 14, Quadrature = 15, Trax = 16, Tantrix = 17, Amazons = 18, Octi = 19, Gess = 20. - More chars trasliterated in (ttn html-world) procs' output Previously, only "<" was changed to "L". Now, "&" is changed to "8" and ">" is changed to "7", as well. - Change to (ttn html-data) proc: `p' This proc now takes an optional arg, any value of which causes begin and end ("

" and "

", respectively) style rendering around the arg. - New field type for (ttn read-text-db-table) proc: `read-text-db-table' A field may now be declared as having type `rest-lines-trim', which arranges for the reading procedure to extract the rest of the lines of the record before the delimiter (exactly like field type `rest-lines'), and additionally to apply `string-trim-both' (from SRFI-13) to the result before collecting it. - New module: (ttn rw-vcg) VCG is a program to layout and visualize graphs in 2D. This module allows you to read and write .vcg files (which specify "nodes" and "edges" and their attributes as well as global attributes) produced by or for VCG, from a Scheme program. - 0.40 | 2005-01-04 - Bugfix to (ttn spewutils) proc `eval-html-data-file' ttn-pers-scheme 0.39 introduced a bug whereby this proc evaluated the data file in the wrong environment. - New procs for (ttn html-data) Specifically: q, em, strong, dfn, code, samp, kbd, var, cite, abbr. - 0.39 | 2005-01-03 - New (ttn grep) proc: grep-l - New (ttn expand-file-name) proc: substitute-env-vars - New (ttn expand-file-name) proc: expand-file-name-substituting-env-vars - Experimental read-hash extension Proc `give-me-a-sane-environment-please!' (for interactive sessions) now extends the read-hash table to handle `#^Ffoo' as essentially `(expand-file-name-substituting-env-vars "foo")', a string. Here is some elisp that uses this feature: (local-set-key "\C-cf" (lambda (file) (interactive "fFile: ") (insert "#\C-f" file))) - New (ttn sanity) proc: pp - New (ttn html-data) proc: blockquote - Module (ttn edit) now simply re-exports (ice-9 editing-buffer) The functionality and the exported macro `editing-buffer' of module (ttn edit) has been moved to Guile 1.4.x. At some point (ttn edit) will no longer be maintained, although the interface is still provided for the time being. Along w/ this change, module (ttn gpgutils) uses module (ice-9 editing-buffer) directly now, instead of (ttn edit). - 0.38 | 2004-12-03 - Bugfix to (ttn edit) expansion of `case' The expander for `editing-buffer' used to transform `case' expressions incorrectly: adding an extra set of parens for each element in the choices list. - Module no longer maintained: (ttn display-table) This functionality has migrated to Guile-PG (see link below). - Module no longer maintained: (ttn eformat) - Module no longer maintained: (ttn defvar) These will be dropped in some future release. - New module: (ttn sgf) - Extensions to (ttn html-data) proc `href' This now takes an optional third arg `name'. For example: (flatten (href "x" "y" "z")) =| y Additionally, `url' can be #f, in which case it is omitted. For example: (flatten (href #f "y" "z")) =| y - Extension to `collect-files-sorted-by-mtime' This proc now takes keyword args: #:key PROC, applying PROC to each element in `files' to get the actual filename to stat. - Info entry now under category "Guile modules" It used to be under "Software Libraries". - 0.37 | 2004-08-05 - Module no longer maintained: (ttn pgtype) - Module no longer maintained: (ttn pgtable) - Module no longer maintained: (ttn pgmeta) The functionality provided by these modules has migrated to Guile-PG, with homepage: http://www.glug.org/people/ttn/software/guile-pg/ Thus, although these modules are still provided here for the time being, they are no longer being maintained. This means, among other things, that the configure script no longer recognizes option "--enable-pgtable-check-db=NAME". - Extension to (ttn edit) "e:" proc `insert' If OBJECT is a gap buffer, its contents are inserted. Point moves forward as usual. - Bugfixes to (ttn edit) buffer traversal "e:" procs New tests for this module revealed some discrepencies w/ Emacs for return values and behavior of `forward-line', and behavior of `beginning-of-line' and `end-of-line'. In particular (i.e., as expected ;-), edge and corner cases for buffers w/ and w/o newlines proved most useful for exposing bugs. See edit.test in the tests/ subdirectory for details (more tests welcome). - New (ttn dirutils) proc: mkdir-p - New (ttn fileutils) proc: filename-absolute-or-in-vicinity - New (ttn expand-file-name) proc: reset-tilde-cache! - Changes to (ttn html-world) procs The procs `html-world' and `html-world.html-data' now also accept keywords for the #:gen value. - Start of switch to (ice-9 gap-buffer) In preparation for migration of (ttn gap-buffer) functionality to module (ice-9 gap-buffer), modules that used the former have been changed to use the latter. The complete list is: (ttn call-process-to-buffers) (ttn edit) (ttn find-file) (ttn flatten-to-buffer) (ttn gpgutils) (ttn make-buffered-caller) (ttn parse-rfc822) (ttn save-buffer) (ttn write-buffer-if-changed) (ttn write-buffer) At some point (ttn gap-buffer) will no longer be maintained, although it is still provided here for the time being. - 0.36 | 2004-07-02 - Change to (ttn personal-pgtable) proc: `all-defs' This proc now understands the two-form format of the meta file, where the first form is a list of (KEYWORD EXPANSION) specs, and the second form is the database table-spec alist, as before. For example, before the change -- one form: (("mydb" ("table1" (a text "NOT NULL" "UNIQUE") (b text "NOT NULL" "UNIQUE")) ("t2" (a text "NOT NULL" "REFERENCES table1 (a)" "MATCH FULL" "ON UPDATE CASCADE") (a text "NOT NULL" "REFERENCES table1 (b)" "MATCH FULL" "ON UPDATE CASCADE")))) After the change -- two forms: ((#:nn "NOT NULL") (#:u "UNIQUE") (#:r "REFERENCES") (#:mf "MATCH FULL") (#:uc "ON UPDATE CASCADE")) (("mydb" ("table1" (a text #:nn #:u) (b text #:nn #:u)) ("t2" (a text #:nn #:r "table1 (a)" #:mf #:uc) (b text #:nn #:r "table1 (b)" #:mf #:uc)))) The table specs after the change are easier to read and less prone to typing errors, especially in an environment that fontifies Scheme keywords (like Emacs), than before the change. - 0.35 | 2004-06-21 - New (ttn edit) "e:" procs These procs are now available: (forward-line &optional n) (beginning-of-line &optional n) (end-of-line &optional n) (bolp) (eolp) They are valid within the `editing-buffer' macro. Please refer to Emacs docstrings for functions by the same name, for more info. - Performance improvements in (ttn edit) search/replace Some unnecessary string consing has been eliminated in the search/replace operations; they are now a bit quicker. - 0.34 | 2004-06-10 - Changes to functionality - Bugfix to (ttn filesystem-tree-to-list) This proc used to improperly nest empty sibling subdirectories due to mis-{understanding,handling} of level information. The DFS collection algorithm has been rewritten to use base (prefix) comparisons. - `read-text-db-table' handles CRLF for eol in addition to LF - `email-log-if-fail' changes This now supports multiple semicolon-separated command lists (not only a single list). Also, the return value is now specified: #t means the command was successful, #f means not (implies mail was sent out). - `call-process-to-buffers' no longer requires external program touch(1) - `slackful-concat-proc' now accepts a keyword as well as a symbol - New procs - In (ttn personal-pgtable): `personal-pgtable-worker' - In (ttn dirutils): `extract-stem-proc' - In (ttn html-data): `br' and `center' - Dropped module: (ttn psql) - Dropped scripts - display-rcs-state-summary - generate-autoload - 0.33 | 2004-01-30 - Info page installed At long last, there is documentation. Also distributed, but not installed, is the same documentation in HTML format. The availability of docs somewhat explains the brevity of the New Foo items below. - Installation updates module catalog (if supported by system) - Bugfix to (ttn edit) proc: `looking-at' A bug was fixed whereby regular expressions beginning with "^" were not handled correctly: `looking-at' would return #f when point was in fact at the beginning of the line. It would only return #t if point was at the beginning of the buffer. - Input pipe explicitly closed The following procs now explicitly do a `close-pipe' when done reading input, allowing memory to be collected: (ttn shell-command-to-string) shell-command-to-string shell-command-to-list shell-command->string shell-command->list - Internal (ttn gap-buffer) values bumped up (define default-initial-allocation (* 2 1024)) (define default-chunk-size 1024) (define default-realloc-threshold 32) - New (ttn dirutils) proc: `filtered-files-in-vicinity' - New module: (ttn METAINFO) - New module: (ttn cvsutils) This is analogous to (ttn rcsutils), for CVS. - New module: (ttn read-text-db-table) - New module: (ttn personal-pgtable) - New module: (ttn rlog-scan-proc) - New scripts These are not installed but are mentioned here since they play a part in the methodology. - steal-this-package Actually, running this program results in an error at this time. The adventurous may wish to pursue the matter anyway. - collect-lessons This is used to help maintain the "Learning Scheme Programming" node in the Guide. The mechanisms are in place but the actual recording of lessons is still very much in the future. - Makefile oriented to CVS Source has moved from RCS to CVS and the top-level Makefile now reflects that (notably for "make dist"). - 0.32 | 2003-08-05 - "make check" improvements The test for (ttn gpgutils) does a "gpg --verify" and compares expected values against obtained results. The time component of the test has been localized to work outside of the PST (UTC offset "+0800" or 28800 seconds) time zone. - New module: (ttn optargs-kw-utils) At the moment, this just exports `remove-keys', which is used to remove keyword/value pairs from an "argument rest" list, since those are not automatically removed by `define*' et al. - Changes to (ttn call-process) The `remove-keys' proc is no longer available in this module. See new module (ttn optargs-kw-utils) above, instead. - Changes to (ttn html-world) - proc `html-world' now takes keywords #:size and #:gen - proc `html-world.html-data' likewise The original image as generated by xearth(1) has a default size of 150x150 pixels (which after ASCIIfication fits comfortably in an 80-column screen). You can now pass #:size N to `html-world' to specify an NxN-pixel originating image. Additionally, the default backend program has been changed from xearth(1) to xplanet(1), the former having been stigmatized as non-free software, at least by Debian. As it turns out, by the time you read this, the LZW patent will have expired, so now it's ok to use xearth after all! In any case, you can pass #:gen BACKEND, where BACKEND is a symbol `xplanet' or `xearth', to `html-world' to select the preferred image generator. - procs `refresh' and `textarea' now handle numerical args These now detect if the `sec' and `row'/`col' args, respectively, are numbers and do a `number->string' for you. Strings continue to be supported. - bugfix for proc `input' Elements are now properly interspersed with spaces. - 0.31 | 2002-09-27 - Bugfix to (ttn spewutils) Use `eval-in-module' to be explicit. - New configure option Previously, enabling (ttn pgtable) testing was a hairy process. Now this is handled by passing "--enable-pgtable-check-db=NAME" to configure. See README. - Distribution changes - Directory ttn/testing/benchmarks/ is now at top-level Benchmarking is back; i.e., you can now do "make tea" again. See Makefile for BENCHMARK_ITERATION_MULTIPLIER usage. - Directory ttn/testing/ttn/ is now renamed to tests/ at top-level Additionally, the tests are broken out into individual files, and the Makefile now uses "guile-tools run-all-tests" to run them. You can choose specific tests to run like so: make check ALLTESTS="ftw.test gap-buffer.test" DEBUG=1 Omit DEBUG=1 for a more silent running. The log is written to tests/CHECK.LOG. You can do "make check" in either top-level or directly in the tests/ subdirectory. - 0.30 | 2002-08-13 - Bugfix to (ttn html-data) Proc `copyright' no longer hardcodes "2001". Instead, the value is taken from the current year. - Bugfix to (ttn expand-file-name) The new algorithm has been implemented that now handles "../.." in the presence of a "~USER" and other funky cases properly. - Deprecated module: (ttn ftw) The `ftw' and `nftw' procs have now been folded into Guile in its (ice-9 ftw) module. (ttn ftw) just loads (ice-9 ftw) for now but it will probably go away in the future. - New (ttn gap-buffer) proc: gb->port! This proc sends GB contents to PORT efficiently. - `save-buffer' now verifies operation This proc, in (ttn save-buffer), now checks the written file to see that it has the same size as the buffer contents, returning #t if so. - 0.29 | 2002-01-12 - Functionality news - Change to (ttn html-data) Proc `html' now includes the "!DOCTYPE" jazz, woo hoo! - New module: (ttn split-mbox) Exported proc `split-mobx' doc: Read lines from PORT, splitting at "^From " (note space), and returning a list of messages, each a list of lines. - Change to (ttn parse-rfc822) Proc `parse-rfc822' now also accepts a list of lines as arg `mailmsg', in addition to gap-buffer or string. The returned closure now accepts key `body-lines', which returns the lines comprising the body. The intent is to allow easy line-oriented processing. - Change to (ttn pgtable) New proc `pg-result-symbol' can be used instead of `pg-result-status' from module (database postgres), to return a symbol (e.g., `PGRES_COMMAND_OK'). This change allows (ttn pgtable) to be used w/ any installed version of guile-pg 0.07, instead of only those hacked by ttn (e.g., 0.07ttn4) to do the symbolic translation in C. See README for updated dependency info. - Administrative news - New files: modules.af, autogen.sh Configuration now makes use of some Guile facilities for automatically maintaining module dependency info. The file modules.af is processed by "guile-tools autofrisk" to create modules.af.m4, which defines AUTOFRISK_CHECKS now referenced by ./configure.in. Following widespread packaging convention, there is now the top-level script autogen.sh, which invokes various tools to set things up. This script accepts option "--verbose". Lastly, (ttn gpgutils) and (ttn pgtable) testing configuration is now handled in part by ./configure, although there is still some manual component. This will continue to lessen in the future. See README for details. - Testing output less verbose Output of "make check" is now more of summary (by module). You can do "make DEBUG=1 check" to see details. - "make dist" no longer requires full tag The full tag is computed in the same way used in "make newtag=FRAG tag". Thus, you can use FRAG everywhere. The varname is changed as a reminder: "make dtag=FRAG dist" (instead of "disttag="). - No more autoload file This means the benchmarks are not available this release. - 0.28 | 2001-12-17 - (ttn ftw) benchmark now uses "/etc" instead of "/" / can be humongous, /etc is big enough anyway. (Actually, /etc isn't very deep, maybe /usr is better.) - Changes to (ttn html-data) - New procs: `name', `dl', `dll' These are and
...
(last one takes a single list, similar to `ul' and `ull'). - `copyright-since' arg can now be either string or number - New procs in (ttn spewutils) (update-all-pages! source-page pages) (update-all-html-data-pages! pages) SOURCE-PAGE is proc that is mapped over PAGES, a list of filenames. The latter proc calls the former w/ the standard filename transformer: FOO.html -> FOO.html-data. - Timestamp type conversion in (ttn pgtype) more restricted When converting the PostgreSQL "timestamp" type to Scheme, the value is now an integer, the number of second since epoch. This loses for times before the epoch, so this restriction may be (re-)lifted in the future. - New module: (ttn display-table) This module exports `display-table', which has been moved out of (ttn pgtable), although it is still available there for now. `display-table' now also takes optional arg STYLE, which is a symbol, one of: space fat-space h-only fat-h-only v-only +-only no-h no-v fat-no-v no-+ If omitted, the default is to use "-", "|" and "+" for the horizontal, vertical and intersection decorations, respectively. - `pgtable-manager' in (ttn pgtable) now supports alists The table manager now also supports `table->alists' and `tuples-result->alists'. In both cases, the return value is a list of alists, with each alist corresponding to a tuple in the table (keys are column names). - Benchmarking results updated The release process now (again) updates files tea-1.0 and tea-0.2 -- dev machine specs follow: Linux 2.2.19pre17 (gcc version 2.7.2.3) i686 unknown Detected 199434 kHz processor. Calibrating delay loop... 398.13 BogoMIPS Memory: 29784k/32768k available (1744k kernel code, 412k reserved, 672k data, 156k init) Dentry hash table entries: 4096 (order 3, 32k) Buffer cache hash table entries: 32768 (order 5, 128k) Page cache hash table entries: 8192 (order 3, 32k) - 0.27 | 2001-11-28 - New module: (ttn flatten) This module exports the proc `flatten': (flatten tree . out) Walk TREE depth-first, displaying elements if they are strings. Signal "bad type" error for non-string, non-list elements. Optional 2nd arg OUT is a procedure to use instead of `display'. - New module: (ttn write-buffer-if-changed) This module exports the proc `write-buffer-if-changed': (write-buffer-if-changed buffer filename) Write BUFFER into file FILENAME but only if the contents are different. FILENAME is passed through `expand-file-name', q.v. FILENAME cannot be a directory. - New module: (ttn collect-files-sorted-by-mtime) This module exports the proc `collect-files-sorted-by-mtime': (collect-files-sorted-by-mtime files collect) Sort FILES by modification time, and map COLLECT over the result. FILES is a list of filenames. COLLECT is a proc that accepts two args, the filename and its modification time. - New module: (ttn flatten-to-buffer) This module exports the proc `flatten-to-buffer' and alias `flatten->buffer': (flatten-to-buffer tree . gb) (flatten->buffer tree . gb) Call `flatten' on TREE, saving output to new gap-buffer, and return it. Optional arg GB specifies a gap-buffer to use instead of newly allocating. - New module: (ttn spewutils) This module exports the procs: (eval-html-data-file file) (spew-html! html-data outfile . log) (update-page! template-file outfile . log) This module's interface is likely to change and should not be considered stable just yet. - Changes to (ttn dirutils) `save-cwd' A bug was fixed in this macro where the body's return value was being discarded. - Changes to (ttn html-world) - Size reset to ttn-pers-scheme-0.09 value The initial image used as a basis for the output now has size 150 by 150 pixels (it used to be 200 by 200). This is basically because the author is now using an 80-column web browser again. - More external dependencies The programs "ppmtopgm" and "pgmtopbm" now also need to be in the PATH for `html-world' to work correctly. Older versions of pbmtoascii used to be able to take ppm files directly, but that apparently is no longer the case. The README has been updated. - New proc: html-world.html-data This proc is the preferred interface; `html-world' and `render-html-world' are deprecated. Docstring follows: Call `html-world' w/ arg LINKS, and reformat the output as html-data tree. See `html-world' for more info on LINKS. - Changes to (ttn html-data) - New proc: tt-pre This wraps its args w/ "
" and "
". - Bug fix: `html' no longer includes "Content-type: text/html\n\n" - 0.26 | 2001-11-14 - "New" modules The following modules were created by pulling out one or two procs from either (ttn fileutils) or (ttn shellutils). This was done to reduce memory overhead in the case of unused definitions in the same module as the definition you are actually interested in. (ttn email-log-if-fail) from (ttn fileutils) (ttn expand-file-name) (ttn save-buffer) (ttn write-buffer) (ttn find-file) (ttn call-process) from (ttn shellutils) (ttn call-process-to-buffers) (ttn make-buffered-caller) In the future, other (ttn *utils) modules will probably be similarly factored. - Other changes to (ttn fileutils) Three new procs are exported: `filename-sans-end-sep-proc', `filename-components' and `filename-components-append'. The latter two are inverses. Here are the docstrings: - filename-sans-end-slash NAME Return NAME, a string, stripping the terminating "/" character. If there is no "/", just return NAME. - filename-components STRING Return a list of filename components parsed from STRING. Components are delimited by "/", which is discarded. - filename-components-append LS Return a string composed by interspersing LS elements w/ "/". - Other changes to (ttn shellutils) A new proc is exported: `(sysfmt . args)'. Docstring: Apply `format' to ARGS and pass to `system'. - Changes to (ttn html-data) Three new procs are exported: `ull', `copyright' and `copyright-since'. Signatures are: (ull x) ; variant of `ul' that takes single list (copyright . prefix) (copyright-since year) - 0.25 | 2001-11-02 - New distributed file: BUGS This file is formatted similarly to the guile BUGS file. - New module: (ttn html-data) This module exports the following procs: (html . x) (href url text) (head . x) (title x) (body . x) (h1 x) (h2 x) ... (h6 x) (hr) (b x) (p) (textarea rows cols name x) (input type name value) (form method action . x) (refresh sec url) (li x) (ul . x) (table x) (tr x) (td x) All procs return lists (possibly nested), suitable for walking w/ a "flattening" procedure, something like: (define (output-html-data x) (cond ((string? x) (actual-output x)) ((list? x) (for-each output-html-data x)) (else (error "unknown type:" x)))) ACTUAL-OUTPUT might send X to a port, for example. - 0.24 | 2001-10-30 - (ttn gap-buffer) `gb?' is now exported - New module: (ttn parse-rfc822) This module exports one procedure `parse-rfc822', which has the following docstring: Parse MAILMSG, return a query proc. MAILMSG may be a gap-buffer, or something that `make-gap-buffer' takes. The query proc takes a symbol COMP, and returns the message component COMP. Supported values for COMP are: from -- first whitespace-delimited token after "^From " on first line headers -- the headers as an alist (keys are strings), order maintained body -- rest of the mail message Any other query results in a "bad component" error. - 0.23 | 2001-10-04 - Configuration accepts guile versions 1.5.x, 1.6.x, 1.7.x - New distributed file: .release.scm This is basically a program for doing a release, included here for completeness. (At this time, it is evaluated completely by the human maintainer, but the goal is to eventually mechanize the release process entirely.) - Bugfixes - (ttn stringutils) `string-append/separator' handles null 2nd arg - (ttn pgtable) `tuples-result->table' handles zero-tuples case Previously, `tuples-result->table' would try to create a table of size 0, causing an error. This has been changed to instead create a table of size 1. (In fact, should some result imply a negative number of tuples, the returned table still has size 1.) - Throughout, `write-line' replaced w/ `display' and `newline' - New platform: benchmarks fubar for now - 0.22 | 2001-08-26 - "make check" for `call-process' no longer looks for exact string match Part of the testing for (ttn shellutils) proc `call-process' is to check the buffer caputuring standard error for non-successful calls. Previously, the stderr output was subject to direct string comparison w/ an expected value. This methodology fails, however, when the locale differs from that of the author's, since a localized error message will be unlikely to match directly, even though the behavior is correct. (In this case, /bin/ls stderr in French is definitely not the same as that in English.) Thus, these tests now check that the stderr buffer is non-empty instead of doing a string match. This is less rigorous than before, but the alternative is to dig deep into localization issues, which is somewhat of a pain. - 0.21 | 2001-08-14 - Changes to (ttn scat) - Macro `define-sl' no longer provided - New proc: `sl->bytes' - More procedure documentation: now 88/128 (69%) complete - "make tea" now uses ttn/autoload.scm directly The benchmarking process used to process the autoload file to replace "guile-user" with "guile" because Guile used to set the default current module differently for scripts and for repls. Since Guile has been changed to use "guile-user" consistently for all situations, the substitution is no longer necessary. - Dependencies updated - Guile 2001-08-13 (from cvs repo) - guile-pg 0.07ttn3 - 0.20 | 2001-07-14 - "make check" and "make tea" now allow choice of Guile interpreter By default, the interpreter "guile" is used (should be on your path). However, you can specify another Guile like so: make GUILE=/some/path/to/alternate/guile check This is useful to identify (in)compatibilities. At this time, no effort is made to infer the proper `%load-path' given an arbitrary Guile interpreter; you will need to set env var `GUILE_LOAD_PATH' manually, either in the shell or passing it through `make' similar to how `GUILE' is handled. - Changes to (ttn scat) This module, not under any active development since 1998, has undergone an overhaul. A bug was fixed in `make-scat' whereby omission of DEFAULT-VALUE caused an error. The semantics of `scat-concat' are now reversed: first arg is shifted instead of second arg. `make-sl' now accepts field defs w/ numeric values instead of hex strings, as long as the bit length is also specified. User var `sl-field-def-check-func' is no longer available and `make-sl' no longer calls it. `copy-sl' has been renamed to `sl-copy'. `sl-edit' has been renamed to `sl-edit!', and a copying (non destructive) version named `sl-from-template' is now available. Additionally, we now do some (ttn scat) testing on "make check". - 0.19 | 2001-05-19 - Benchmarking news A traversal benchmark for (ttn gap-buffer) was added. The poor results prompted a complete implementation redesign (interface not changed). Traversal performance is now linear w/ buffer size instead of being higher-powered (it was so very VERY *VERY* inefficient we had to kill the benchmark for fear of burning out the CPU on the dev box -- how's that for "higher-power"? ;-). Redesign helped all operations. Insert performance is now linear w/ length of inserted string. Delete performance is now O(1). Intimate module (ttn edit) was also modified with expected (though unquantified) performance gain. - Administrative news - Sync w/ development Guile (1.5.x) There was previously some attempt at remaining compatible w/ guile-1.4, but that has now been abandoned, due primarily to these features / changes available only in the Guile development version: - (ice-9 rdelim) required for `read-line' and friends, but `use-modules' no longer can be conditionalized, so the old `(or (defined? 'read-line) (use-modules (ice-9 rdelim)))' workaround no longer works. - new `use-modules' functionality -- actually, we have sufficient functionality in (ttn moduleutils) (where the new `use-modules' stuff originated :-) but `use-modules' is more standard. - `identity' makes a return -- this used to be provided in (ice-9 boot-9), then someone renamed it `id' then someone re-renamed it `identity' again; welcome back, old friend! - (ice-9 documentation) and (ice-9 session) now work together to allow files following the Guile Documentation Format Version 2 to be added to the search list and searched using "(help 'NAME)". - (scripts read-scheme-source) is useful for bin/snarf-docs. - README dependencies more explicit Starting w/ this release, the Dependencies section in the README specifies a development version (usually by date) of guile-core that works well with ttn-pers-scheme (has been tested with "make check"). Sorry for the extra hassle. Once the next version of Guile is released (supposedly Real Soon Now), we will sync to that and try to remain there. Aside from the overall Guile dependency, we also list packages or programs which are required for specific modules. - Documentation methodology starting to be defined Doing "make" now also produces ttn-procedures-docs.txt, which follows the Guile Documentation Format Version 2, and doing "make install" copies this file to the site directory (see README). The goal is to have all exported procedures documented by next release; this is approximately 59% (76/129) complete. Procedure documentation is snarfed using bin/snarf-docs, a work in progress (significant bits of which will probably make it into Guile's (scripts read-scheme-source) module at some point). So far, the recognized format is simply: contiguous comments before a top-level form that share the same number of leading semicolons. See bin/snarf-docs for more info. - Makefile changes Bug fixes: Symlink now made in ttn/testing/benchmarks and bin. On "make dist", touch file ttn/testing/ttn/.dont-check-gpgutils in dist dir to prevent "make check" from trying to check (ttn gpgutils). See README for more info. Documentation is now made and installed. See news item above. Doing "make clean" now removes autoload and docs files. - New program: snarf-docs This is described above (see "Administrative news"). - New module: (ttn gpgutils) This module exports eight procedures: read-line-no-echo siginfo:signer clearsign-message-interactively siginfo:time verify-signed-message siginfo:method siginfo:sig siginfo:body See the documentation for each procedure for more info. - Changes to (ttn sanity) New proc `know-that-ttn-procedures-docs-is-available!' finds ttn-procedures-docs.txt using `%search-load-path' and adds the file's absolute path to (ice-9 documentation) variable `documentation-files'. This allows "(help 'grep)" to work, for example. This proc is exported. Proc `give-me-a-sane-environment-please!' now calls `know-that-ttn-procedures-docs-is-available!'. Also, it no longer tries to activate the readline library. - Changes to (ttn edit) A bug was fixed in `e:re-search-forward' that caused the "^" regular expression operator to fail to match beginning of line. This was due to omission of the `regexp/notbol' flag. - Changes to (ttn pgtable) Column definitions are now extended to have the form: (NAME TYPE [OPTION1 OPTION2...]) Each OPTION is a string. Options are concatenated with spaces separating them and passed directly to the back end. The old form: (NAME . TYPE) is still recognized but is deprecated and will no longer be supported in a future release. Three new element extraction procedures are now available: `def:col-name', `def:type-name' and `def:type-options'. These DTRT w/ both the old form and the new. - 0.18 | 2001-04-09 - Benchmarking news Some benchmarks for (ttn ftw) have been added. You can run them specifically with: "make benchmarks=ftw tea". The "make tea" command now also works in ttn/testing/benchmarks. To reduce maintenance, benchmark common header code now no longer uses modules directly with `use-modules', with the exception of a few absolutely required modules. Instead, the autoload file created by top-level "make" is copied to the benchmark directory and modified so that the module defined to receive all the autoloaded bindings is `(guile)' instead of `(guile-user)'. This modified copy is then loaded. The release process now specifies capturing logs of two runs of "make tea", the second with iteration multiplier of 1/5. These logs are in the benchmark directory as tea-1.0 and tea-0.2, respectively. - Changes to (ttn ftw) Both `ftw' and `nftw' procs now handle optional arg sequence `hash-size N', where N specifies the size of the hash table to used for recording visited files. The default size is 211. Thanks to Brad Knotwell for this performance enhancement patch. - New module: (ttn pgtype) PostgreSQL type conversion has been moved into this module. Additionally, PostgreSQL array conversion has been generalized. Docstrings reproduced here (note that `define-db-col-type' docstring has changed from VERSION 0.16 release): - `dbcoltype-lookup' TYPE-NAME - `dbcoltype:name' LOOKUP-VALUE - `dbcoltype:default' LOOKUP-VALUE - `dbcoltype:stringifier' LOOKUP-VALUE - `dbcoltype:objectifier' LOOKUP-VALUE Return lookup value of TYPE-NAME, a symbol, from `*db-col-types*'. Use procs `dbcoltype:name', `dbcoltype:default', `dbcoltype:stringifier' and `dbcoltype:objectifier' on this value to access those components, respectively. - `define-db-col-type' NAME DEFAULT STRINGIFIER OBJECTIFIER Register type NAME with DEFAULT, STRINGIFIER and OBJECTIFIER procs. NAME is a symbol. DEFAULT is a string to use if the Scheme object is #f. STRINGIFIER is a proc that takes a Scheme object and returns a string suitable for use in an "INSERT VALUES" SQL command. OBJECTIFIER is a proc that takes a string and returns the Scheme object parsed out of it. Both STRINGIFIER and OBJECTIFIER need not worry about SQL-style quoting (using single quotes) and related quote escaping. If NAME already exists, it is redefined. - `define-db-col-type-array-variant' COMPOSED SIMPLE [PROCS] Register type COMPOSED, an array variant of SIMPLE, with optional PROCS. SIMPLE should be a type name already registered using `define-db-col-type'. COMPOSED is conventionally formed by appending SIMPLE with one or more pairs of square braces "[]", with the number of pairs indicating the array dimensionality. For example, if SIMPLE is `text', a two-dimensional text array would be named `text[][]'. Optional arg PROCS is a list specifying alternative stringifier and objectifier procedures (in that order). If unspecified, SIMPLE is looked up and its stringifier and objectifier are used. The default value of all array types is "{}" and cannot be changed. - Changes to (ttn pgtable) Typing machinery has been moved to (ttn pgtype). This includes var `*db-col-types*' and convenience proc `double-quote'. Also, some modules (ttn pgtable) depends on are now autoloaded. - New program: display-rcs-state-summary This is a simple wrapper around the procedure of the same name in (ttn rcsutils). This type of wrapping may be automated in the future. - Program generate-autoload no longer sets env var GUILE_LOAD_PATH The makefile that calls generate-autoload now sets the path appropriately. This change is so that generate-autoload can be conveniently called in different contexts. Generally, programs in this directory should not set GUILE_LOAD_PATH. - Administrative news Doing "make rcs-state-summary" now also checks subdir bin. Distribution also includes benchmark logs. These are to satisfy curiosity only; it's unlikely that the numbers mean anything. - 0.17 | 2001-03-29 - Administrative changes - Autoload file no longer distributed Instead it is created when you do "make". The script bin/generate-autoload also serves as a sanity check for the package since it uses some of the modules right from the distribution. The no longer necessary elisp program ttn/update-autoload.el has been removed. - New directory: bin This holds maintenance scripts. At this time, there is only generate-autoload. - Change to (ttn stringutils) - New proc: string-quoted/escaped STRING Return `write'-like output of STRING, with some characters escaped. This means that instead of, for example, a literal newline appearing in the output, the two-character sequence `\n' is used. The complete list of escaped characters is: #\\, #\newline, #\ht, #\cr, #\page. These result in `\\', `\n', `\t', `\r' and `\f', respectively." - Changes to (ttn pgtable) - New supported type: `serial' - `pgtable-manager' enhancements The closure returned by this proc now can handle commands `delete-rows' and `update-col', and queries `table-name' and `defs'. Also, when doing a `drop', if the table has any columns that have type `serial', any associated magic PostgreSQL sequences are also dropped. As of PostgreSQL 7.x, the sequence name is TABLENAME_COLNAME_seq. For more info, see the PostgreSQL User Guide, Chapter 3: Data Types. - Bugfix in type `text[]' The objectifier proc now handles the empty set correctly. - Bugfix in (ttn fileutils) The autoload trigger lists now include `gb->string'. - Change to (ttn grep) Both `grep' and `grep-matches' now take an additional flag `literal' which means that STRING is to be searched for literally and not to be considered a regular expression. - Change to (ttn gap-buffer) Proc `make-gap-buffer' now takes an arg INIT, which can be a string or an input port. If INIT is a port, it is read until EOF. In both cases point is left at the end of the buffer. - Changes to (ttn edit) - New "e:" proc: `buffer-port' This returns a soft port on the current buffer. See bin/generate-autoload for an example use. - Bugfix in `letrec' and `let*' expansion Previously, these forms were expanded correctly with the exception of the initial symbol, which was hardcoded to `let'. This is now fixed to preserve the variant name. - `insert' now also takes symbols and sexps The string inserted is computed by applying `symbol->string' to symbols, and `write' to sexps. - Change to (ttn shellutils) The exit value of applying the closure returned by `make-buffered-caller' to `execute' is now saved and can be retrieved later with the `exit-val' query. An error is signalled if `exit-val' is requested before either `execute' or `execute/no-init' has been invoked after initial closure creation or command redefinition. - New module: (ttn listener) One proc is exported: `make-listener'. Docstring follows: - `make-listener' LISTENER-PORT #:SETUP-SOCK #:NQUEUE #:PRE #:HANDLE #:POST Return a thunk that listens on TCP/IP port number LISTENER-PORT. Key #:setup-sock specifies a procedure that is passed the listener socket right before doing `bind'. This is a good place for `setsockopt' calls. Key #:nqueue specifies the number of queued requests, default 10. Keys #:pre, #:handle and #:post specify procedures that take two args, PORT and CONN, the output of `accept', q.v. These three procedures are thunkified to form the branches of a `dynamic-wind' operating in its own thread. After calling the post procedure, PORT is closed. If pre, handle, and post are unspecified, the default action is to do nothing. - 0.16 | 2001-03-19 - Benchmark framework added You can now do "make tea" which runs some benchmarks, displaying user and system CPU usage for each case. You can increase or decrease the iteration counts by specifying an env var like so: make BENCHMARK_ITERATION_MULTIPLIER=N tea N can be an integer, a floating point number, or even a rational number. The actual number of iterations computed is displayed. See ttn/testing/benchmarks/Makefile var `benchmarks' for the full list of benchmarks. You can specify a subset like so: make benchmarks='baseline gap-buffer' tea Furthermore, for benchmark FOO, see FOO.scm for various options to skip parts of the benchmarks. For example: make benchmarks='gap-buffer' opts='--skip-make-gap-buffer' tea At this time, there are only a few benchmarks, but if your computer is as slow as the author's, perhaps you can escape the scourge of "instant tea". - Changes to (ttn pgtable) - New proc: `define-db-col-type' NAME DEFAULT STRINGIFIER OBJECTIFIER Register type NAME with DEFAULT, STRINGIFIER and OBJECTIFIER procs. NAME is a symbol. DEFAULT is a string to use if the Scheme object is #f. STRINGIFIER is a proc that takes a Scheme object and returns a string suitable for use in an "INSERT VALUES" SQL command (including SQL quotes). OBJECTIFIER is a proc that takes a string (without SQL quotes) and returns the Scheme object parsed out of it." See ttn/pgtable.scm for examples; (ttn pgtable) uses this proc for its own initialization. - New supported type: `bool' - Bugfixes The return value of the `table->object-alist' `pgtable-manager' managed proc is now ordered properly. The `timestamp' stringifier only attempts to convert numbers, and leaves strings alone. - Changes to (ttn moduleutils) - Retired proc: `ls' This was such a thin wrapper around `apropos' that we can forego it w/o much sadness. - New macro: `import-from-module' OTHER-MODULE-NAME . NAMES Import into current module from OTHER-MODULE-NAME variables NAMES. Each element of NAMES is taken to be either a variable name, or a pair (OLD-NAME . NEW-NAME) describing the mapping to be used. OLD-NAME needs to be defined in OTHER-MODULE-NAME, though it need not be exported. - New macro: `reexport-from-module' OTHER-MODULE-NAME . SPECIFICALLY Re-export variables from module named OTHER-MODULE-NAME. If optional args SPECIFICALLY is the empty list, all public variables from OTHER-MODULE-NAME are exported, otherwise, each element in SPECIFICALLY is taken to be either a symbol naming a variable to be exported, or a pair of symbols of the form (OLD-NAME . NEW-NAME) describing the mapping to be used. OLD-NAME should name an exported variable in OTHER-MODULE-NAME. This macro was snarfed from in THUD. - Changes to (ttn fileutils) - Performance enhanced procs: `find-file', `save-buffer' - New proc: `write-buffer' BUFFER FILENAME Write BUFFER into file FILENAME. FILENAME is passed through `expand-file-name', q.v. This makes the buffer visit that file. FILENAME cannot be a directory. - Changes to (ttn gap-buffer) - Performance enhanced proc: `gb->lines' - Bugfix `gb-goto-char' now returns `new-point', even if that is an invalid point (in which case, point is set to `point-min' or `point-max' anyway). This mimics the behavior of GNU Emacs. - New module: (ttn edit) This module exports a macro `editing-buffer'. Docstring: Consider BUFFER the "current buffer" and execute BODY. In BODY, applications of one of `current-buffer-procs' (see source) are handled specially. There is too much other stuff to document in this NEWS file, so here's a short program that gives a taste of what can be done: #!/bin/sh exec guile -s $0 $0 # -*- scheme -*- !# (use-modules (ttn fileutils) (ttn edit) (ttn echo)) (editing-buffer (find-file (cadr (command-line))) (while (re-search-forward "^.+<([^>]*[^^])>" (point-max) #t) (echo (match-string 1)))) ;; ;; #! !# Save this to foo, do "chmod +x foo", install ttn-pers-scheme somewhere in the `%load-path' and run foo. The program should display "find this tag". Procs supported: point, point-min, point-max, buffer-string, buffer-substring, goto-char, forward-char, backward-char, match-data, set-match-data, match-string, looking-at, match-beginning, match-end, search-forward, search-backward, re-search-forward, replace-match, insert, delete-char, erase-buffer, delete-region. - Testing news Testing (ttn pgtable) is now more flexible; the database name you set up need not be the same as your user name. See README for revised instructions. - 0.15 | 2001-03-07 - New module: (ttn stringutils) This module was actually introduced in version 0.14 but not documented then. Four procedures are provided: `string-ws-trim', `string/sep->substrings', `string-append/separator' and `mapconcat'. See docstrings for more info. - New module: (ttn pgtable) Four procedures are exported: `tuples-result->table', `display-table', `where-clausifier' and `pgtable-manager'. Docstrings are reproduced here. - `tuples-result->table' RES Extract data from the tuples result RES, and return an annotated array. The array's values correspond to the data from RES, and has dimensions `pg-ntuples' by `pg-nfields'. Annotations are object properties: names -- vector of field names widths -- vector of maximum field widths - `display-table' TABLE Display table TABLE, including header and ASCII field-separators. - `pgtable-manager' DB-NAME TABLE-NAME DEFS Return a proc that manages a table specified by DB-NAME TABLE-NAME DEFS. DB-NAME and TABLE-NAME are strings. DEFS is a list of symbol pairs, the car being the field name and the cdr the PostgreSQL type name. For example: ((time . timestamp) (error . text) (files . text[])) The returned proc accepts a single arg CHOICE (a symbol) and returns either the variable or procedure associated with CHOICE. When CHOICE is `help' or `menu', return a list of accepted choices. When CHOICE is `types-list', return a list of supported PostgreSQL types. - `where-clausifier' STRING Return an SQL "where clause" from STRING. - Changes to (ttn grep) Both `grep' and `grep-matches' now understand a `count' flag directing these procs to return the length of the result list instead of the list itself. This flag can be used (in a list) with the other flags. - Testing news There is a new file ttn/testing/ttn/check-pgtable.scm that tests (ttn pgtable). By default, this is not enabled because there are dependencies that are not easy to check for or guarantee (we might get to it later, however). See file README for instructions on how to get things to work. - 0.14 | 2001-03-05 - Retired module: (ttn original-sin) This was an experiment that may be revived as (ttn reflection). A better approach (for strings, at least) is Keisuke Nishida's embedded format module -- see (ttn eformat) immediately below. - New module: (ttn eformat) --- Repackage Keisuke Nishida's (eformat) This code was posted originally w/o copyright by Keisuke Nishida: From: kxn30@po.cwru.edu Subject: eformat Date: Tue, 19 Dec 2000 10:22:49 -0500 To: guile-sources@gnu.org, guile-user@gnu.org The following changes have been made: (1) Module name now `(ttn eformat)'. (2) Added `activate-eformat' and `deactivate-eformat'. (3) Removed surrounding `let'. (4) Procedure `embedded-format' now does not expect the first entry to be a port, and no longer applies `format' to that port at read-time. Instead, we return an application of a closure that does the format, hardcoding the first arg of `format' to #f. Thus, the result is always a string. (See example below.) To use, place `(activate-eformat)' and `(deactivate-eformat)' around the code that represents a string as `#[ stuff ]'. Note that these forms modify `read-hash-procedures' and work by read-time side-effects, so they must be at top-level. *WARNING WARNING WARNING*: Do not forget `deactivate-eformat'! Example: (activate-eformat) (define (zz x) #[$x is a $(lambda () (if (number? x) "" "non-"))number]) (deactivate-eformat) (zz 42) => "42 is a number" (zz zz) => "# is a non-number" See ttn/testing/ttn/check.scm for more examples. - 0.13 | 2001-02-27 - New module: (ttn grep) --- Pick mappings according to regexp line match Two procs are exported: `grep' and `grep-matches'. Docstrings are reproduced here. - `grep' RE STRINGS . FLAGS Return list of matches to regexp RE from STRINGS list. Optional args FLAGS are zero or more symbols which modify regexp matching: `invert' -- the result list is those strings that do NOT match `fold-case' -- consider upper and lower case to be identical Return list order is the same as in the input list. - `grep-matches' RE STRINGS . FLAGS Return non-#f match results of `regexp-exec' of regexp RE on STRINGS list. Optional args FLAGS are zero or more symbols which modify regexp matching: `invert' -- the result list is composed entirely of #t values, with length equal to the number of strings that do NOT match (not very useful; this option listed for completeness) `fold-case' -- consider upper and lower case to be identical Return list order is the same as in the input list. - New module: (ttn fileutils) --- Munge files in core Two procs are exported: `expand-file-name' and `find-file'. Docstrings are reproduced here. - `expand-file-name' NAME . DEFAULT-DIRECTORY Convert filename NAME to absolute, and canonicalize it. Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative (does not start with slash); if DEFAULT-DIRECTORY is #f or missing, `(getcwd)' is used. File name components that are `.' are removed, and so are file name components followed by `..', along with the `..' itself; note that these simplifications are done without checking the resulting file names in the file system. An initial `~/' expands to your home directory. An initial `~USER/' expands to USER's home directory. - `find-file' FILENAME Insert file named FILENAME into a buffer, and return that buffer. FILENAME is passed through `expand-file-name', q.v. If the file is not readable, return #f. - `save-buffer' BUFFER Save BUFFER to disk. BUFFER should be from `find-file', q.v. An error is thrown if BUFFER's `filename' object-property is not set. An error is thrown if the file cannot be written. - Changes to (ttn gap-buffer) - new proc: `gb-erase!' GB - new proc: `gb-filter!' GB PROC-TAKING/RETURNING-STRING - new proc: `gb->lines' BG - new proc: `gb-filter-lines!' GB PROC-TAKING/RETURNING-LIST - `make-gap-buffer-port' now throws error if arg not a gap-buffer - Changes to (ttn shellutils) - new proc: `args->normalized-list' ARGS For ARGS, trim surrounding whitespace, join together separated by space, then split apart on space boundaries. For example: (args->normalized-list "rsync a b c" " d " "e" "f g h") => ("rsync" "a" "b" "c" "d" "e" "f" "g" "h")" This is used by `call-process' and `call-process->buffers'. - new proc: `call-process' PROGRAM . ARGS Call PROGRAM synchronously in separate process w/ optional ARGS. Key `#:inp' specifies the program's input port; #f means `/dev/null'. Key `#:outp' specifies the program's output port; #f means discard output; 0 means discard and don't wait. Key `#:errp' specifies the program's error output port; #f means discard output. If omitted, ports default to standard input, output and error ports, respectively. If the output port is 0, return immediately with value #f. Otherwise wait for PROGRAM to terminate and return a numeric exit status. Key `#:norm' specifies whether or not PROGRAM and ARGS should be passed through `args->normalized-list' (default no processing). - new proc: `call-process->buffers' PROGRAM . ARGS Call PROGRAM synchronously in separate process w/ optional ARGS. Key `#:inb' specifies the program's input buffer. Key `#:outb' specifies the program's output buffer Key `#:errb' specifies the program's error output buffer. Default is that all buffers are specified as `#f. Key `#:norm' specifies whether or not PROGRAM and ARGS should be passed through `args->normalized-list' (default no processing). Return a numeric exit status. - new proc: `make-buffered-caller' PROGRAM . ARGS Return a procedure that is capable of calling PROGRAM w/ optional ARGS. When called, the program stdout and stderr are captured to buffers. The key `#:inb' (default #f) specifies an input buffer to use for the call. The returned procedure takes one of the following commands (a symbol): redefine NEW-DEF -- Redefine the called program and its args. NEW-DEF is one or more strings. execute -- Call program, clearing buffers first. Return exit status of the program. execute/no-init -- Same as `execute', w/o clearing buffers first. outbuf -- Return output buffer object. outbuf-string -- Return output buffer as a string. outbuf-lines -- Return output buffer as a list of strings. errbuf -- Return error output buffer. errbuf-string -- Return error output buffer as a string. errbuf-lines -- Return error output buffer as a list of strings. - 0.12 | 2001-02-18 - New module: (ttn gap-buffer) --- String buffer that supports point A gap buffer is a structure that models a string but allows relatively efficient insertion of text somewhere in the middle. The insertion location is called `point' with minimum value 1, and a maximum value of the length of the string (which is not fixed). A gap buffer port is a soft port (see Guile manual) that wraps a gap buffer. Character and string writes, as well as character reads, are supported. Flushing and closing are not supported. These procedures are exported: make-gap-buffer gb-point GB gb-point-min GB gb-point-max GB gb-insert-string! GB STRING gb-insert-char! GB CHAR gb-delete-char! GB COUNT gb-goto-char GB LOCATION gb->string GB make-gap-buffer-port GB The term and concept of "gap buffer" are borrowed from Emacs. We will gladly return them when libemacs.so is available. ;-> This implementation could be made (much) more efficient; the goal of this release is to establish the exported interface. See ttn/testing/ttn/check.scm for example usage. - 0.11 | 2001-01-31 No user visible changes, if you are using guile-1.4. If you are using guile from cvs post 2001-01-21, this release allows (ttn shell-command-to-string) to work properly. - 0.10 | 2001-01-26 - Change to (ttn cron) In the case where COMMAND matches no key, `cron' now silently returns #t instead of #f. This is to facilitate wrapping by `exit', as demonstrated here: #!/bin/sh exec guile -s $0 "$@" !# (exit (cron (command-line) ((hourly) (write-line "yawn, stretch")) ((daily) (write-line "zonk")))) - Changes to (ttn rcsutils) - new proc: `rcs-files-under' In directory DIR, return a list of DIR/RCS/*,v files. - proc no longer exported: `group-files-by-rcs-state' This was used by `display-rcs-state-summary' but nowhere else, so we thought it better to hide it until actually needed outside the module. - `display-rcs-state-summary' output now line-oriented Lines are formatted: `STATE YYYY/MM/DD HH:MM:SS FILENAME' and are ordered most recently changed first, grouped by state. FILENAME is constructed using the DIR argument and will always have at least one directory-element separator ("/" for all systems ttn cares about). - 0.09 | 2001-01-12 - Changes to (ttn html-world) The initial image used as a basis for the output now has size 200 by 200 pixels (it used to be 150 by 150). - New module: (ttn shellutils) --- work easily with the Bourne shell Two procedures are exported: `system*' and `email-log-if-fail'. See docstrings for more info. - 0.08 | 2001-01-05 - New module: (ttn cron) --- Provide cron-compatible framework This file exports `cron', a macro that has signature: (cron CMDLINE-LIST . HANDLERS) CMDLINE-LIST is a two-element list, of the form: (PROG-NAME COMMAND) HANDLERS is zero or more forms: ((KEY) (BODY1) (BODY2) ...) BODY1, BODY2 and so on are optional. KEY is a symbol or string. The body forms for a KEY are executed if COMMAND matches KEY. If CMDLINE-LIST does not have exactly two elements, a usage message is displayed and a "bad usage" error is signalled. If COMMAND matches no key, `cron' silently returns #f, otherwise, the return value is the value of the last body form executed. Example: #!/bin/sh exec guile -s $0 "$@" !# (cron (command-line) ((hourly) (write-line "yawn, stretch")) ((daily) (write-line "zonk"))) See also link at end of http://www.glug.org/projects/wurlds.html for example usage. - 0.07 | 2000-12-26 - Bug fix for (ttn html-world) Line chunking was dropping match prefixes. This is now fixed. Although we don't yet have a test for "make check", here's some code you can use to do visual inspection: (use-modules (ttn echo) (ttn html-world)) (echo "
")
	(render-html-world display (html-world "just" "some" "urls"))
	(echo "
") If you put the above into test.scm, you can do: guile -s test.scm > test.html - `shell-command->list' now takes optional 2nd arg This arg (or the symbol `trim', if omitted) is passed to `read-line'. Valid args are symbols `trim', `peek', `concat' and `split'. - 0.06 | 2000-12-24 - New module: (ttn mixp) --- simplified abstraction for mixp You must install mixp to use this module. See http://www.thbz.cx/mixp for more info. - Bug fix for "make check" A bug was fixed in the Makefile that caused "make check" to fail for the distribution but not in the developer build directory, which goes to show that the development process is not quite mature yet. (Although "make check" failed, ttn-pers-scheme 0.05 installed correctly and was usable, anyway.) - Path to xearth no longer hardcoded in (ttn html-world) To use (ttn html-world) you need to have `xearth', `mogrify', `pbmtoascii' and `tr' in your PATH somewhere. - 0.05 | 2000-12-22 - Changes in installation procedure We now use the standard configure.in-based install procedure, which uses "guile-config info pkgdatadir" to determine where to install files. See file README for more info. Also, the file INSTALL has been removed from the distribution. - New modules - (ttn slackful-concat) --- Low-hassle string/symbol concatenation - (ttn html-world) --- Render xearth in ASCII, inserting HTML links See the Commentary and procedure docstrings in each module for more info. - Changes to (ttn sanity) and (ttn original-sin) The development version of Guile no longer allows certain procs (e.g., `getenv') to accept symbols. We use `symbol->string' where things break; however, there has not been a systematic code review. - Changes to (ttn shell-command-to-string) - new procs: `shell-command-to-list', `shell-command->list' The second is an alias for the first. Each line of the shell command (sans newline) is an element of the return value, a list. - 0.04 | 2000-10-16 - New modules See the Commentary in each module for more info. - (ttn filesystem-tree-to-list) --- grok fs tree as nested list - (ttn original-sin) --- frictionless value transfer - (ttn moduleutils) --- module system hackery - Retired modules - (ttn @) --- Macro to peek at variables inside modules - (ttn ls) --- Commands for interactive module browsing These were merged into (ttn moduleutils). - Changes to (ttn echo) - new procs: `echow', `echo-n' and `echow-n' `echow' is similar to `echo' but uses `write' instead of `display'. The "-n"-named variants are similar to those w/o "-n" but omit the terminating newline. - 0.03 | 2000-10-02 - New modules See the Commentary in each module for more info. - (ttn scat) --- serial concatenation for building packets - (ttn abbrev-tree) --- hierarchical abbreviations - (ttn slice) --- sub-sequence selection using indexes - Changes to (ttn dirutils) - new proc `filename-sans-end-sep-proc' This procedure takes one arg, a character used to separate components in a filename, and returns a procedure that, given a filename, returns the filename w/o a terminating separating character. In the case where the filename consists only of the separating character, it is returned unchanged. - Changes to (ttn ftw) - bug fix in procedure `ftw' The procedure `ftw' now returns #t only if all callbacks return #t. Any value other than #t is immediately taken as the return value for `ftw'. Previously, only #f would terminate the walk. - procedure `nftw' implemented This is similar to `ftw' but w/ more options ("nftw" stands for "new filesystem tree walk"). See Commentary in ftw.scm for more info. - Testing framework added The Makefile target "check" (i.e., "make check") now runs several tests to ensure functionality of various modules. If you see an error when doing this, please mail the maintainer the result of running the command "make DEBUG=1 check". - More helpful Makefile The default target (i.e., "make") now displays command lines grepped from the Makefile directly. Here is the current output: $ make No default action makes sense; read the Makefile. Or be adventurous, and try one of these: make check make TTN_CHECK_DONT_MUNGE_LOAD_PATH=1 check make instdir=DIR install make newtag=SOME-TAG tag make disttag=FULL-TAG dist make rcs-state-summary make snapshot - 0.02 | 2000-09-12 - New modules See the source file for each module for more info. - (ttn dirutils) --- handle directories - (ttn ftw) --- filesystem tree walk - (ttn rcsutils) --- handle RCS files - (ttn shell-command-to-string) --- capture shell command stdout - Makefile now supports "make instdir=DIR install". See file INSTALL for installation instructions. - You can now use update-autoload.el in the distribution. If there is no RCS subdir in the distribution directory, one is created and autoload.scm is registered there. From then, when you load update-autoload.el into Emacs, it will do the right thing and keep a history of its changes to autoload.scm. - 0.01 | 2000-07-09 This initial release is mainly to get the release process going so that we may debug it. Local Variables: mode: outline outline-regexp: "\\([ ][ ]\\)*- " fill-column: 72 fill-prefix: "\t" End: