mes: resurrect running MesCC: update info interface.
[mes.git] / module / mes / fluids.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; This file is part of Mes.
7 ;;;
8 ;;; Mes is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; Mes is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
20
21 ;;; Commentary:
22
23 ;;; Code:
24
25 (mes-use-module (mes scm))
26
27 (define (f:env:define a+ a)
28   (set-cdr! a+ (cdr a))
29   (set-cdr! a a+)
30   ;;(set-cdr! (assq '*closure* a) a+)
31   )
32
33 (define (env:escape-closure a n)
34   (if (eq? (caar a) '*closure*) (if (= 0 n) a
35                                     (env:escape-closure (cdr a) (- n 1)))
36       (env:escape-closure (cdr a) n)))
37
38 (define-macro (module-define! name value a)
39   `(f:env:define (cons (sexp:define (cons 'define (cons ',name (cons ,value '()))) ,a) '()) (env:escape-closure ,a 1)))
40
41 (define-macro (make-fluid . default)
42   `(begin
43      ,(let ((fluid (symbol-append 'fluid: (gensym)))
44             (module (current-module)))
45         `(begin
46            (module-define! ,fluid
47                            (let ((v ,(and (pair? default) (car default))))
48                              (lambda ( . rest)
49                                (if (null? rest) v
50                                    (set! v (car rest))))) ',module)
51            ',fluid))))
52
53 (define (fluid-ref fluid)
54   (fluid))
55
56 (define (fluid-set! fluid value)
57   (fluid value))
58
59 (define-macro (fluid? fluid)
60   `(begin
61      (and (symbol? ,fluid)
62           (symbol-prefix? 'fluid: ,fluid))))
63
64 (define (with-fluid* fluid value thunk)
65   (let ((v (fluid)))
66     (fluid-set! fluid value)
67     (let ((r (thunk)))
68       (fluid-set! fluid v)
69       r)))
70
71 ;; (define-macro (with-fluids*-macro fluids values thunk)
72 ;;   `(begin
73 ;;      ,@(map (lambda (f v) (list 'set! f v)) fluids values)
74 ;;      (,thunk)))
75
76 ;; (define (with-fluids*-next fluids values thunk)
77 ;;   `(with-fluids*-macro ,fluids ,values ,thunk))
78
79 ;; (define (with-fluids* fluids values thunk)
80 ;;   (primitive-eval (with-fluids*-next fluids values thunk)))
81
82 ;; (define-macro (with-fluids bindings . bodies)
83 ;;   `(let ()
84 ;;     (define (expand bindings a)
85 ;;       (if (null? bindings)
86 ;;           (cons (car bindings) (expand (cdr bindings) a))))
87 ;;     (eval (begin ,@bodies) (expand ',bindings (current-module)))))
88
89 (define (dynamic-wind in-guard thunk out-guard)
90   (in-guard)
91   (let ((r (thunk)))
92     (out-guard)
93     r))