diff --git a/Makefile.am b/Makefile.am index 17eac4f..eaca651 100644 --- a/Makefile.am +++ b/Makefile.am @@ -37,6 +37,7 @@ endif # HAVE_GENHTML test-list: ; @echo $(TESTS) MODULES = \ + geesh/environment.scm \ geesh/lexer.scm \ geesh/parser.scm \ geesh/repl.scm @@ -45,6 +46,7 @@ bin_SCRIPTS = \ scripts/geesh TESTS = \ + tests/environment.scm \ tests/lexer.scm \ tests/parser.scm \ tests/repl.scm diff --git a/geesh/environment.scm b/geesh/environment.scm new file mode 100644 index 0000000..6614733 --- /dev/null +++ b/geesh/environment.scm @@ -0,0 +1,53 @@ +;;; The Geesh Shell Interpreter +;;; Copyright 2018 Timothy Sample +;;; +;;; This file is part of Geesh. +;;; +;;; Geesh is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; Geesh is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with Geesh. If not, see . + +(define-module (geesh environment) + #:use-module (ice-9 match) + #:use-module (srfi srfi-9) + #:export ( + make-environment + environment? + var-ref + set-var!)) + +;;; Commentary: +;;; +;;; This module contains data structures and functions for the +;;; environment of the Shell language. +;;; +;;; Code: + +(define-record-type + (%make-environment vars) + environment? + (vars environment-vars set-environment-vars!)) + +(define (make-environment vars) + ;; In order to insure that each pair in the 'vars' alist is mutable, + ;; we copy each one into a new list. + (%make-environment (map (match-lambda + ((key . val) (cons key val))) + vars))) + +(define (var-ref env name) + (assoc-ref (environment-vars env) name)) + +(define (set-var! env name val) + (set-environment-vars! env (acons name val + (environment-vars env)))) + diff --git a/tests/environment.scm b/tests/environment.scm new file mode 100644 index 0000000..147ecb0 --- /dev/null +++ b/tests/environment.scm @@ -0,0 +1,56 @@ +;;; The Geesh Shell Interpreter +;;; Copyright 2018 Timothy Sample +;;; +;;; This file is part of Geesh. +;;; +;;; Geesh is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation, either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; Geesh is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with Geesh. If not, see . + +(define-module (test-environment) + #:use-module (geesh environment) + #:use-module (srfi srfi-64) + #:use-module (tests automake)) + +;;; Commentary: +;;; +;;; Tests for the environment module. +;;; +;;; Code: + +(test-begin "environment") + +;;; +;;; Variables. +;;; + +(test-equal "Stores existing variables" + "bar" + (let ((env (make-environment '(("FOO" . "bar"))))) + (var-ref env "FOO"))) + +(test-equal "Stores new variables" + "bar" + (let ((env (make-environment '()))) + (set-var! env "FOO" "bar") + (var-ref env "FOO"))) + +(test-equal "Updates variables" + "baz" + (let ((env (make-environment '(("FOO" . "bar"))))) + (set-var! env "FOO" "baz") + (var-ref env "FOO"))) + +(test-equal "Returns '#f' for unset variables" + #f + (let ((env (make-environment '()))) + (var-ref env "FOO")))