fixed env for step4, update step3
[jackhill/mal.git] / guile / env.scm
1 ;; Copyright (C) 2015
2 ;; "Mu Lei" known as "NalaGinrut" <NalaGinrut@gmail.com>
3 ;; This file is free software: you can redistribute it and/or modify
4 ;; it under the terms of the GNU General Public License as published by
5 ;; the Free Software Foundation, either version 3 of the License, or
6 ;; (at your option) any later version.
7
8 ;; This file is distributed in the hope that it will be useful,
9 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 ;; GNU General Public License for more details.
12
13 ;; You should have received a copy of the GNU General Public License
14 ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16 (library (env)
17 (export make-Env)
18 (import (guile) (types)))
19
20 (define* (make-Env #:key (outer nil) (binds '()) (exprs '()))
21 (define _env (make-hash-table))
22 (define (_set k v) (hash-set! _env k v))
23 (define (_get k)
24 (or (hash-ref _env k) (and (not (_nil? outer)) ((outer 'find) k))))
25 (define (_find k) (_get k))
26 (for-each (lambda (b e) (hash-set! _env b e)) binds exprs)
27 (lambda (cmd)
28 (case cmd
29 ((set) _set)
30 ((find) _find)
31 ((get) _get)
32 (else (throw 'mal-error "BUG: Invalid cmd" cmd)))))