From 3563279b575bd30c190aa021a0d39ea5b92456b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Tue, 4 Jul 2023 19:21:37 +0200 Subject: [PATCH] Add duck module base. --- src/Makefile | 4 +++ src/duck.scm | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/duck.scm diff --git a/src/Makefile b/src/Makefile index 40a49f7..8568f2c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -491,3 +491,7 @@ DOKUWIKI-SOURCES=dokuwiki.scm racket-kwargs.import.scm \ dokuwiki.o: dokuwiki.import.scm dokuwiki.import.scm: $(DOKUWIKI-SOURCES) + +DUCK-SOURCES=duck.scm + +duck.import.scm: $(DUCK-SOURCES) diff --git a/src/duck.scm b/src/duck.scm new file mode 100644 index 0000000..74c6f8a --- /dev/null +++ b/src/duck.scm @@ -0,0 +1,82 @@ +;; +;; duck.scm +;; +;; Duck - a CHICKEN in-source documentation. +;; +;; ISC License +;; +;; Copyright 2023 Dominik Pantůček +;; +;; Permission to use, copy, modify, and/or distribute this software +;; for any purpose with or without fee is hereby granted, provided +;; that the above copyright notice and this permission notice appear +;; in all copies. +;; +;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +;; + +(declare (unit duck)) + +(module + duck + ( + module* + duck-extract-defines + duck-extract-doc + ) + + (import scheme + (chicken base) + (chicken syntax)) + + (define-syntax duck-extract-defines + (syntax-rules (define define/doc make-parameter) + ((_ (define var val)) + (define var val)) + ((_ (define/doc var doc val)) + (define var val)) + ((_ (define/doc var doc arg (make-parameter val))) + (define var val)) + ((_ (define (proc . args) expr ...)) + (define (proc . args) expr ...)) + ((_ expr) + expr))) + + (define-syntax duck-extract-doc + (syntax-rules (define/doc make-parameter) + ((_ mod (define/doc (proc . args) doc expr ...)) + (list 'FUN 'proc `doc 'args)) + ((_ mod (define/doc var doc arg (make-parameter val))) + (list 'PAR 'var `doc 'arg 'val)) + ((_ mod (define/doc var doc val)) + (list 'VAR 'var `doc 'val)) + ((_ mod expr) + #f))) + + (define-syntax module* + (syntax-rules (#:doc) + ((_ modname #:doc (doc ...) exports expr ...) + (module + modname + exports + (import (only scheme define set! quote reverse list quasiquote) + (only (chicken module) export) + (chicken base) + duck + ) + (export modname) + (duck-extract-defines expr) ... + (define modname + (list (list 'MOD 'modname `(doc ...)) + (duck-extract-doc modname expr) ...)))) + ((_ modname expr ...) + (module* modname #:doc () expr ...)))) + + )