From 79afabb4b833e66a29e5a51c7406d85c98483650 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Sun, 8 Sep 2024 15:39:25 +0200 Subject: [PATCH] start with new forge implementation (forge/sf) --- forge/sf.lisp | 33 +++++++++++++++++++++++++++++++++ scopes-core.asd | 7 +++++-- test/test-sf.lisp | 33 +++++++++++++++++++++++++++++++++ util/iter.lisp | 6 +++++- 4 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 forge/sf.lisp create mode 100644 test/test-sf.lisp diff --git a/forge/sf.lisp b/forge/sf.lisp new file mode 100644 index 0000000..9f56d1c --- /dev/null +++ b/forge/sf.lisp @@ -0,0 +1,33 @@ +;;;; cl-scopes/forge - may the forge be with you! + +;;;; A Forth-like interpreter implemented in Common Lisp. + +(defpackage :scopes/forge/sf + (:use :common-lisp) + (:local-nicknames (:iter :scopes/util/iter)) + (:export #:*stack* + #:add + #:pushd #:popd)) + +(defpackage :sf-builtin) +(defpackage :sf-user) + +(in-package :scopes/forge/sf) + +(defvar *stack* nil) + +;;;; builtins + +(defun reg2 (sym fn) + (setf (fdefinition sym) #'(lambda () + (pushd (funcall fn (popd) (popd)))))) + +(reg2 'add #'+) + +;;;; core definitions + +(defun pushd (v) + (push v *stack*)) + +(defun popd () + (pop *stack*)) diff --git a/scopes-core.asd b/scopes-core.asd index dfd518b..9499c58 100644 --- a/scopes-core.asd +++ b/scopes-core.asd @@ -14,6 +14,7 @@ "forge/forge" "logging" "util/util")) (:file "core/message" :depends-on ("shape/shape")) (:file "forge/forge") + (:file "forge/sf" :depends-on ("util/iter" "util/util")) (:file "logging" :depends-on ("config" "util/util")) (:file "shape/shape") (:file "util/util") @@ -27,8 +28,10 @@ :depends-on (:scopes-core) :components ((:file "test/test-config") (:file "test/test-core") - (:file "test/test-forge")) + (:file "test/test-forge") + (:file "test/test-sf")) :perform (test-op (o c) (symbol-call :scopes/test-config :run) (symbol-call :scopes/test-core :run) - (symbol-call :scopes/test-forge :run))) + (symbol-call :scopes/test-forge :run) + (symbol-call :scopes/test-sf :run))) diff --git a/test/test-sf.lisp b/test/test-sf.lisp new file mode 100644 index 0000000..79709f3 --- /dev/null +++ b/test/test-sf.lisp @@ -0,0 +1,33 @@ +;;;; cl-scopes/test/test-forge + +;;;; testing facility for scopes/forge + +(defpackage :scopes/test-sf + (:use :common-lisp) + (:local-nicknames (:forge :scopes/forge/sf) + (:util :scopes/util) + (:t :scopes/testing)) + (:export #:run) + (:import-from :scopes/testing #:deftest #:==)) + +(in-package :scopes/test-sf) + +(defun run () + (let ((t:*test-suite* (t:test-suite "forge/sf"))) + ;(forge:*forge-env* (forge:forge-env))) + ;(setf forge:*forge-env* (forge:forge-env)) + ;(forge:setup-builtins) + (test-exec))) + +(deftest test-exec () + (util:lgi 42) + (== (+ 2 1) 3) + (forge:pushd 4) + (forge:pushd 2) + (forge:add) + (== (forge:popd) 6) + ;(forge:exec-str "4 2 +") + ;(== (car (forge:dstack)) 6)) + (t:show-result)) + + diff --git a/util/iter.lisp b/util/iter.lisp index b09f3cc..a940626 100644 --- a/util/iter.lisp +++ b/util/iter.lisp @@ -4,6 +4,10 @@ ;;;; producing items (objects) like: numbers, strings, symbols, lists, ... (defpackage :scopes/util/iter - (:use :common-lisp)) + (:use :common-lisp) + (:export #:list-iterator)) (in-package :scopes/util/iter) + +(defclass list-iterator () + ((data :reader data :initarg :data :initform nil)))