aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog35
-rw-r--r--doc/skr/api.skr124
-rw-r--r--doc/user/bib.skb11
-rw-r--r--doc/user/engine.skb14
-rw-r--r--doc/user/htmle.skb2
-rw-r--r--doc/user/image.skb4
-rw-r--r--doc/user/index.skb2
-rw-r--r--doc/user/latexe.skb2
-rw-r--r--doc/user/lib.skb12
-rw-r--r--doc/user/package.skb8
-rw-r--r--doc/user/sectioning.skb2
-rw-r--r--doc/user/slide.skb8
-rw-r--r--doc/user/xmle.skb10
-rw-r--r--src/guile/skribilo/utils/compat.scm8
14 files changed, 154 insertions, 88 deletions
diff --git a/ChangeLog b/ChangeLog
index 25a5820..4d0dbf0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,41 @@
# arch-tag: automatic-ChangeLog--lcourtes@laas.fr--2005-mobile/skribilo--devel--1.2
#
+2006-01-17 22:50:23 GMT Ludovic Courtes <ludovic.courtes@laas.fr> patch-26
+
+ Summary:
+ Towards a self-hosted user manual.
+ Revision:
+ skribilo--devel--1.2--patch-26
+
+ * doc/skr/api.skr: Use `(skribilo reader)' and `(skribilo utils syntax)'.
+ (api-search-definition): Added a SKRIBE-SOURCE? argument.
+ Determine the appropriate reader based on its value.
+ (keyword->symbol): Removed.
+ (define-markup?): Fixed.
+ (make-engine?): Fixed (but unverified).
+ (make-engine-custom): Likewise.
+ (sym/kw?): New.
+ (define-markup-formals): Fixed.
+ (define-markup-options): Likewise.
+ (define-markup-rest): Likewise.
+ (doc-markup): Added a SKRIBE-SOURCE? argument.
+ (doc-engine): Likewise.
+
+ * doc/user/*.skb: Updated the `:source' arguments to `doc-markup' and
+ `doc-engine'.
+
+ * src/guile/skribilo/utils/compat.scm (hashtable-update!): Fixed
+ according to the Bigloo manual.
+
+ modified files:
+ ChangeLog doc/skr/api.skr doc/user/bib.skb doc/user/engine.skb
+ doc/user/htmle.skb doc/user/image.skb doc/user/index.skb
+ doc/user/latexe.skb doc/user/lib.skb doc/user/package.skb
+ doc/user/sectioning.skb doc/user/slide.skb doc/user/xmle.skb
+ src/guile/skribilo/utils/compat.scm
+
+
2006-01-16 22:31:32 GMT Ludovic Courtes <ludovic.courtes@laas.fr> patch-25
Summary:
diff --git a/doc/skr/api.skr b/doc/skr/api.skr
index 70016b9..6d0c5bd 100644
--- a/doc/skr/api.skr
+++ b/doc/skr/api.skr
@@ -9,7 +9,9 @@
;* The Skribe style for documenting Lisp APIs. */
;*=====================================================================*/
-(use-modules (ice-9 match))
+(use-modules (ice-9 match)
+ (skribilo reader) ;; `make-reader'
+ (skribilo utils syntax)) ;; `%skribilo-module-reader'
;*---------------------------------------------------------------------*/
;* Html configuration */
@@ -60,9 +62,13 @@
;* ------------------------------------------------------------- */
;* Find a definition inside a source file. */
;*---------------------------------------------------------------------*/
-(define (api-search-definition id file pred)
+(define* (api-search-definition id file pred :optional (skribe-source? #t))
+ ;; If SKRIBE-SOURCE? is true, then assume Skribe syntax. Otherwise, use
+ ;; the ``Skribilo module syntax''.
(let* ((path (append %load-path (skribe-path)))
- (f (find-file/path file path)))
+ (f (find-file/path file path))
+ (read (if skribe-source? (make-reader 'skribe)
+ %skribilo-module-reader)))
(if (not (string? f))
(skribe-error 'api-search-definition
(format #f "can't find source file `~a' in path"
@@ -73,7 +79,7 @@
(let loop ((exp (read)))
(if (eof-object? exp)
(skribe-error 'api-search-definition
- (format #t
+ (format #f
"can't find `~a' definition" id)
file)
(or (pred id exp) (loop (read))))))))))
@@ -93,29 +99,20 @@
(or (and (null? d1) (null? d2))
(list d1 d2))))
-;*---------------------------------------------------------------------*/
-;* keyword->symbol ... */
-;*---------------------------------------------------------------------*/
-(define (keyword->symbol kwd)
- (let ((s (keyword->string kwd)))
- (if (char=? #\: (string-ref s 0))
- ;; Bigloo
- (string->symbol (substring s 1 (string-length s)))
- ;; STklos
- (string->symbol s))))
;*---------------------------------------------------------------------*/
;* define-markup? ... */
;*---------------------------------------------------------------------*/
(define (define-markup? id o)
(match o
- ((or 'define-markup 'define 'define-inline
- (? (lambda (x) (eq? x id)))
- (? (lambda (x) (or (pair? x) (null? x)))))
+ (((or 'define-markup 'define 'define-inline)
+ ((? (lambda (x) (eq? x id)))
+ . (? (lambda (x) (or (pair? x) (null? x)))))
+ . _)
o)
- ((define-simple-markup (? (lambda (x) (eq? x id))))
+ (('define-simple-markup (? (lambda (x) (eq? x id))))
o)
- ((define-simple-container (? (lambda (x) (eq? x id))))
+ (('define-simple-container (? (lambda (x) (eq? x id))))
o)
(else
#f)))
@@ -125,13 +122,14 @@
;*---------------------------------------------------------------------*/
(define (make-engine? id o)
(match o
- (((or make-engine copy-engine) (quote (? (lambda (x) (eq? x id)))) . ?-)
+ (((or 'make-engine 'copy-engine)
+ (quote (? (lambda (x) (eq? x id)))) _)
o)
- ((quasiquote . ?-)
+ ((`_)
#f)
- ((quote . ?-)
+ ((_)
#f)
- ((?a . ?d)
+ ((a d)
(or (make-engine? id a) (make-engine? id d)))
(else
#f)))
@@ -141,13 +139,16 @@
;*---------------------------------------------------------------------*/
(define (make-engine-custom def)
(match (memq :custom def)
- ((:custom (quote ?custom) . ?-)
+ ((:custom `custom _)
custom)
- ((:custom ?custom . ?-)
+ ((:custom custom _)
(eval custom))
- (else
+ (else
'())))
+(define (sym/kw? x)
+ (or (symbol? x) (keyword? x)))
+
;*---------------------------------------------------------------------*/
;* define-markup-formals ... */
;* ------------------------------------------------------------- */
@@ -156,26 +157,24 @@
;*---------------------------------------------------------------------*/
(define (define-markup-formals def)
(match def
- ((?- (?- . ?args) . ?-)
- (if (symbol? args)
- (list args)
- (let loop ((args args)
- (res '()))
- (cond
- ((null? args)
- (reverse! res))
- ((symbol? args)
- (reverse! (cons args res)))
- ((not (symbol? (car args)))
- (reverse! res))
- (else
- (loop (cdr args) (cons (car args) res)))))))
- ((define-simple-markup ?-)
+ ((_ (id args ___) _ ___)
+ (let loop ((args args)
+ (res '()))
+ (cond
+ ((null? args)
+ (reverse! res))
+ ((symbol? args)
+ (reverse! (cons args res)))
+ ((not (symbol? (car args)))
+ (reverse! res))
+ (else
+ (loop (cdr args) (cons (car args) res))))))
+ (('define-simple-markup _)
'())
- ((define-simple-container ?-)
+ (('define-simple-container _)
'())
(else
- (skribe-error 'define-markup-formals
+ (skribe-error 'define-markup-formals
"Illegal `define-markup' form"
def))))
@@ -186,19 +185,19 @@
;*---------------------------------------------------------------------*/
(define (define-markup-options def)
(match def
- ((?- (?- . ?args) . ?-)
+ (('define-markup (args ___) _)
(if (not (list? args))
'()
(let ((keys (memq #!key args)))
(if (pair? keys)
- (cdr keys)
+ (cdr keys) ;; FIXME: do we need to filter ((key val)...)?
'()))))
- ((define-simple-markup ?-)
+ (('define-simple-markup _)
'((ident #f) (class #f)))
- ((define-simple-container ?-)
+ (('define-simple-container _)
'((ident #f) (class #f)))
(else
- (skribe-error 'define-markup-formals
+ (skribe-error 'define-markup-formals
"Illegal `define-markup' form"
def))))
@@ -209,7 +208,7 @@
;*---------------------------------------------------------------------*/
(define (define-markup-rest def)
(match def
- ((?- (?- . ?args) . ?-)
+ (('define-markup (args ___) _)
(if (not (pair? args))
args
(let ((l (last-pair args)))
@@ -224,12 +223,12 @@
def)
(cadr rest))
#f))))))
- ((define-simple-markup ?-)
+ (('define-simple-markup _)
'node)
- ((define-simple-container ?-)
+ (('define-simple-container _)
'node)
(else
- (skribe-error 'define-markup-formals
+ (skribe-error 'define-markup-rest
"Illegal `define-markup' form"
def))))
@@ -254,10 +253,10 @@
(d2 (cadr d)))
(if (pair? d1)
(skribe-error 'doc-markup
- (format "~a: missing descriptions" id)
+ (format #f "~a: missing descriptions" id)
d1)
(skribe-error 'doc-markup
- (format "~a: extra descriptions" id)
+ (format #f "~a: extra descriptions" id)
d2))))))
;*---------------------------------------------------------------------*/
@@ -294,7 +293,8 @@
(list " " (keyword opt))))
(define (formal f)
(list " " (param f)))
- (code (list (bold "(") (bold :class 'api-proto-ident (format "~a" id)))
+ (code (list (bold "(") (bold :class 'api-proto-ident
+ (format #f "~a" id)))
(map option (sort options
(lambda (s1 s2)
(cond
@@ -331,6 +331,7 @@
(force-engines '())
(engines *api-engines*)
(sui #f)
+ (skribe-source? #t)
&skribe-eval-location)
(define (opt-engine-support opt)
;; find the engines providing a writer for id
@@ -372,9 +373,11 @@
((and (not def) (not source))
(skribe-error 'doc-markup "source or def must be specified" id))
(else
- (let* ((d (or def (api-search-definition id source define-markup?)))
+ (let* ((d (or def (api-search-definition id source define-markup?
+ skribe-source?)))
(od (map (lambda (o)
- (api-search-definition o source define-markup?))
+ (api-search-definition o source define-markup?
+ skribe-source?))
others))
(args (append common-args args))
(formals (define-markup-formals d))
@@ -545,6 +548,7 @@
#!key
(idx *custom-index*)
source
+ (skribe-source? #t)
(def #f))
(cond
((and def source)
@@ -552,7 +556,8 @@
((and (not def) (not source))
(skribe-error 'doc-engine "source or def must be specified" id))
(else
- (let* ((d (or def (api-search-definition id source make-engine?)))
+ (let* ((d (or def (api-search-definition id source make-engine?
+ skribe-source?)))
(c (make-engine-custom d)))
(doc-check-arguments id c args)
(cond
@@ -571,7 +576,8 @@
(td :align 'left :valign 'top
(list (index (symbol->string (car r))
:index idx
- :note (format "~a custom" id))
+ :note (format #f "~a custom"
+ id))
(symbol->string (car r))))
(let ((def (assq (car r) c)))
(td :valign 'top
diff --git a/doc/user/bib.skb b/doc/user/bib.skb
index a006a9b..c5357af 100644
--- a/doc/user/bib.skb
+++ b/doc/user/bib.skb
@@ -51,7 +51,8 @@ if its argument is a bibliography table as returned by
:see-also '(make-bib-table default-bib-table bibliography the-bibliography)
:force-engines *api-engines*
:common-args '()
- :source "../src/bigloo/bib.bgl")
+ :skribe-source? #f
+ :source "skribilo/biblio.scm")
(p [The function ,(code "default-bib-table") returns a global, pre-existing
bibliography-table:])
@@ -60,7 +61,8 @@ bibliography-table:])
:see-also '(bib-table? make-bib-table bibliography the-bibliography)
:force-engines *api-engines*
:common-args '()
- :source "../src/bigloo/bib.bgl")
+ :skribe-source? #f
+ :source "skribilo/biblio.scm")
(p [The function ,(code "make-bib-table") constructs a new
bibliography-table:])
@@ -69,7 +71,8 @@ bibliography-table:])
:see-also '(bib-table? default-bib-table bibliography the-bibliography)
:force-engines *api-engines*
:common-args '()
- :source "../src/bigloo/bib.bgl"))
+ :skribe-source? #f
+ :source "skribilo/biblio.scm"))
;*---------------------------------------------------------------------*/
;* bibliography ... @label bibliography@ */
@@ -204,7 +207,7 @@ pre-existing functions for sorting entries:])
(doc-markup 'bib-sort/authors
'((l [The list of entries.]))
:force-engines *api-engines*
- :source "../src/common/bib.scm"
+ :source "skribilo/skribe/bib.scm"
:others '(bib-sort/idents bib-sort/dates)
:common-args '())
diff --git a/doc/user/engine.skb b/doc/user/engine.skb
index 06be3c4..b8a5b47 100644
--- a/doc/user/engine.skb
+++ b/doc/user/engine.skb
@@ -11,6 +11,9 @@
;; @indent: (put 'doc-markup 'skribe-indent 'skribe-indent-function)@
(cond-expand
+ (guile
+ (define *engine-src* "skribilo/engine.scm")
+ (define *types-src* #f))
(bigloo
(define *engine-src* "../src/bigloo/engine.scm")
(define *types-src* "../src/bigloo/types.scm"))
@@ -55,6 +58,7 @@ given below:])
(:custom [The engine custom list.])
(:info [Miscellaneous.]))
:common-args '()
+ :skribe-source? #f
:source *engine-src*
:idx *function-index*)
@@ -68,6 +72,7 @@ given below:])
(:symbol-table [The engine symbol table.])
(:custom [The engine custom list.]))
:common-args '()
+ :skribe-source? #f
:source *engine-src*
:idx *function-index*))
@@ -80,6 +85,7 @@ on failure.])
'((id [The name (a symbol) of the engine to be searched.])
(:version [An optional version number for the searched engine.]))
:common-args '()
+ :skribe-source? #f
:source *engine-src*
:idx *function-index*))
@@ -91,7 +97,8 @@ argument is an engine. Otherwise, it returns ,(code "#f"). In other words,
(doc-markup 'engine?
'((obj [The checked object.]))
:common-args '()
- :source *types-src*
+ :skribe-source? #f
+ :source *engine-src*
:idx *function-index*)
(p [The following functions return information about engines.])
@@ -100,7 +107,8 @@ argument is an engine. Otherwise, it returns ,(code "#f"). In other words,
'((obj [The engine.]))
:common-args '()
:others '(engine-format engine-customs engine-filter engine-symbol-table)
- :source *types-src*
+ :skribe-source? #f
+ :source *engine-src*
:idx *function-index*))
(subsection :title "Engine customs"
@@ -117,6 +125,7 @@ a custom.])
,(ref :mark "find-engine" :text (code "find-engine"))).])
(id [The name of the custom.]))
:common-args '()
+ :skribe-source? #f
:source *engine-src*
:idx *function-index*)
@@ -126,6 +135,7 @@ a custom.])
(id [The name of the custom.])
(val [The new value of the custom.]))
:common-args '()
+ :skribe-source? #f
:source *engine-src*
:idx *function-index*)))
diff --git a/doc/user/htmle.skb b/doc/user/htmle.skb
index b5d0b0e..5e556cc 100644
--- a/doc/user/htmle.skb
+++ b/doc/user/htmle.skb
@@ -106,6 +106,6 @@ the document.])
(source-bracket-color "The source bracket color.")
(source-type-color "The source type color.")
(image-format "The image formats for this engine."))
- :source "skr/html.skr")))
+ :source "skribilo/engine/html.scm")))
diff --git a/doc/user/image.skb b/doc/user/image.skb
index d08ad18..ce448df 100644
--- a/doc/user/image.skb
+++ b/doc/user/image.skb
@@ -73,7 +73,9 @@ returns the name of the new converted image. On failure, it returns
searched in the ,(ref :mark "skribe-image-path" :text "image path").])
(formats [A list of formats into which images are converted to.]))
:common-args '()
- :source "../src/bigloo/lib.bgl"
+ :skribe-source? #f
+ :source #f ;;"skribilo/runtime.scm"
+ :def '(define-markup (convert-image file formats) ...)
:see-also '(skribe-image-path)
:idx *function-index*)))
diff --git a/doc/user/index.skb b/doc/user/index.skb
index dd5e8fa..6c9ee1c 100644
--- a/doc/user/index.skb
+++ b/doc/user/index.skb
@@ -50,7 +50,7 @@ that pre-exists to all execution.])
(doc-markup 'default-index
'()
:common-args '()
- :source "src/common/index.scm"))
+ :source "skribilo/skribe/index.scm"))
;*---------------------------------------------------------------------*/
;* Index ... @label index@ */
diff --git a/doc/user/latexe.skb b/doc/user/latexe.skb
index f53737b..860bacd 100644
--- a/doc/user/latexe.skb
+++ b/doc/user/latexe.skb
@@ -45,7 +45,7 @@
(hyperref-usepackage "The LaTeX package for hyperref.")
(image-format "The image formats for this engine.")
(index-page-ref "Indexes use page references."))
- :source "skr/latex.skr"))
+ :source "skribilo/engine/latex.scm"))
(subsection :title "LaTeX documentclass"
diff --git a/doc/user/lib.skb b/doc/user/lib.skb
index 499ca61..e2921fa 100644
--- a/doc/user/lib.skb
+++ b/doc/user/lib.skb
@@ -40,7 +40,8 @@ in the ,(ref :mark "skribe-path" :text "Skribe path").])
(:path ,[The optional path where to find the file. The default
path is ,(markup-ref "skribe-path").])
(#!rest opt... [Additional user options.]))
- :source "../src/bigloo/eval.scm"
+ :skribe-source? #f
+ :source "skribilo/evaluator.scm"
:common-args '()
:see-also '(skribe-load-options skribe-path skribe-path-set!)
:idx *function-index*)
@@ -49,7 +50,8 @@ in the ,(ref :mark "skribe-path" :text "Skribe path").])
,(markup-ref "skribe-load")])
(doc-markup 'skribe-load-options
'()
- :source "../src/bigloo/eval.scm"
+ :skribe-source? #f-
+ :source "skribilo/evaluator.scm"
:common-args '()
:see-also '(skribe-load)
:idx *function-index*)
@@ -61,7 +63,8 @@ when the Skribe compiler is invoked (see Chapter
(doc-markup 'skribe-path
'()
- :source "../src/bigloo/eval.scm"
+ :skribe-source? #f
+ :source "skribilo/evaluator.scm"
:common-args '()
:others '(skribe-image-path skribe-bib-path skribe-source-path)
:see-also '(include skribe-load image source bibliography skribe-path-set! skribe-image-path-set! skribe-bib-path-set! skribe-source-path-set!)
@@ -70,7 +73,8 @@ when the Skribe compiler is invoked (see Chapter
(p [The function ,(code "skribe-path-set!") sets a new path.])
(doc-markup 'skribe-path-set!
'((path [A list of strings which is the new Skribe search path.]))
- :source "../src/bigloo/eval.scm"
+ :skribe-source? #f
+ :source "skribilo/evaluator.scm"
:common-args '()
:others '(skribe-image-path-set! skribe-bib-path-set! skribe-source-path-set!)
:see-also '(skribe-path skribe-image-path skribe-bib-path skribe-source-path)
diff --git a/doc/user/package.skb b/doc/user/package.skb
index ad989d0..b3fe6c3 100644
--- a/doc/user/package.skb
+++ b/doc/user/package.skb
@@ -47,7 +47,7 @@ markup ,(code "abstract"):])
:idx-note "acmproc"
:idx-suffix " (acmproc)"
:force-engines *api-engines*
- :source "../skr/acmproc.skr"))
+ :source "skribilo/package/acmproc.scm"))
(subsection :title (tt "jfp.skr") :ident "jfp"
(index :index *package-index* "jfp.skr" :note "package")
@@ -61,7 +61,7 @@ markup ,(code "abstract"):])
:idx-note "jfp"
:idx-suffix " (jfp)"
:force-engines *api-engines*
- :source "../skr/jfp.skr"))
+ :source "skribilo/package/jfp.scm"))
(subsection :title (tt "lncs.skr") :ident "lncs"
(index :index *package-index* "lncs.skr" :note "package")
@@ -75,7 +75,7 @@ markup ,(code "abstract"):])
:idx-note "lncs"
:idx-suffix " (lncs)"
:force-engines *api-engines*
- :source "../skr/lncs.skr")))
+ :source "skribilo/package/lncs.scm")))
;*---------------------------------------------------------------------*/
;* french */
@@ -102,7 +102,7 @@ This package is to be used to authoring simple letters. It redefines the
:idx-note "letter"
:idx-suffix " (letter)"
:force-engines *api-engines*
- :source "../skr/letter.skr"))
+ :source "skribilo/package/letter.scm"))
;*---------------------------------------------------------------------*/
;* Web */
diff --git a/doc/user/sectioning.skb b/doc/user/sectioning.skb
index 48bbc45..5f1dc3f 100644
--- a/doc/user/sectioning.skb
+++ b/doc/user/sectioning.skb
@@ -101,7 +101,7 @@ paragraphs.])
(p [The function ,(code "p") is an alias for ,(code "paragraph").])
(doc-markup 'p
'((#!rest node... "The nodes of the paragraph."))
- :source "../skr/skribe.skr"
+ :source "skribilo/skribe/api.scm"
:see-also '(document chapter section paragraph)))
;*--- blockquote -----------------------------------------------------*/
diff --git a/doc/user/slide.skb b/doc/user/slide.skb
index c1111ee..0137e84 100644
--- a/doc/user/slide.skb
+++ b/doc/user/slide.skb
@@ -44,7 +44,7 @@ the vertical space size between the title and the body of the slide.])
list ,(code "(split blinds box wipe dissolve glitter)").])
(:bg [The background color of the slide.])
(:image [The background image of the slide.]))
- :source "../skr/slide.skr"))
+ :source "skribilo/package/slide.scm"))
;*---------------------------------------------------------------------*/
;* slide-pause */
@@ -57,7 +57,7 @@ projection.])
(doc-markup 'slide-pause
'()
:common-args '()
- :source "../skr/slide.skr"))
+ :source "skribilo/package/slide.scm"))
;*---------------------------------------------------------------------*/
;* slide-vspace ... */
@@ -70,7 +70,7 @@ projection.])
'((:unit [The unit of the space.])
(#!rest val [The size of the vertical space.]))
:common-args '()
- :source "../skr/slide.skr"))
+ :source "skribilo/package/slide.scm"))
;*---------------------------------------------------------------------*/
;* slide-embed ... */
@@ -92,7 +92,7 @@ to the embedded application.])
(:alt [An alternative Skribe expression to be used if the
output format does not support embedded application.]))
:common-args '()
- :source "../skr/slide.skr"))
+ :source "skribilo/package/slide.scm"))
;*---------------------------------------------------------------------*/
;* Example */
diff --git a/doc/user/xmle.skb b/doc/user/xmle.skb
index 4a1ee78..a1279c7 100644
--- a/doc/user/xmle.skb
+++ b/doc/user/xmle.skb
@@ -13,13 +13,13 @@
;*---------------------------------------------------------------------*/
;* Document */
;*---------------------------------------------------------------------*/
-(section :title "Xml engine" :file #t
+(section :title "XML engine" :file #t
(mark "xml-engine")
- (index "Xml" :note "Engine")
- (p [The Xml engine...])
+ (index "XML" :note "Engine")
+ (p [The XML engine...])
- (subsection :title "The Xml customization"
+ (subsection :title "The XML customization"
(doc-engine 'xml
`()
- :source "skr/xml.skr")))
+ :source "skribilo/engine/xml.scm")))
diff --git a/src/guile/skribilo/utils/compat.scm b/src/guile/skribilo/utils/compat.scm
index 45abd10..c187975 100644
--- a/src/guile/skribilo/utils/compat.scm
+++ b/src/guile/skribilo/utils/compat.scm
@@ -206,7 +206,13 @@
(define-public hashtable? hash-table?)
(define-public hashtable-get (lambda (h k) (hash-ref h k #f)))
(define-public hashtable-put! hash-set!)
-(define-public hashtable-update! hash-set!)
+(define-public (hashtable-update! table key update-proc init-value)
+ ;; This is a Bigloo-specific API.
+ (let ((handle (hash-get-handle table key)))
+ (if (not handle)
+ (hash-set! table key init-value)
+ (set-cdr! handle (update-proc (cdr handle))))))
+
(define-public hashtable->list (lambda (h)
(map cdr (hash-map->list cons h))))