36 lines
663 B
Common Lisp
36 lines
663 B
Common Lisp
;;; cl-scopes/forge - may the forge be with you!
|
|
|
|
;;;; A Forth-like interpreter implemented in Common Lisp.
|
|
|
|
(defpackage :scopes/forge
|
|
(:use :common-lisp)
|
|
(:export #:new-forge-env #:data-stack #:exec
|
|
#:add))
|
|
|
|
(in-package :scopes/forge)
|
|
|
|
(defun new-forge-env ()
|
|
(vector nil))
|
|
|
|
(defun exec (fe code)
|
|
(dolist (x code)
|
|
(if (symbolp x)
|
|
(funcall (find-symbol (symbol-name x) :scopes/forge) fe)
|
|
(pushd fe x))))
|
|
|
|
(defmacro data-stack (fe)
|
|
`(elt ,fe 0))
|
|
|
|
; forge primitives
|
|
|
|
(defun add (fe)
|
|
(pushd fe (+ (popd fe) (popd fe))))
|
|
|
|
; internal definitions
|
|
|
|
(defun popd (fe)
|
|
(pop (data-stack fe)))
|
|
|
|
(defun pushd (fe v)
|
|
(push v (data-stack fe)))
|
|
|