;;; cl-scopes/forge - may the forge be with you! ;;;; A Forth-like interpreter implemented in Common Lisp. (defpackage :scopes/forge (:use :common-lisp) (:export #:forge-env #:data-stack #:exec)) (in-package :scopes/forge) (defvar *builtins* (make-hash-table :test 'equalp)) (defclass forge-env () ((data-stack :initform nil :reader data-stack :accessor data-stack!))) (defun forge-env () (make-instance 'forge-env)) (defun exec (fe code) (dolist (x code) (if (symbolp x) (funcall (gethash (string-downcase (symbol-name x)) *builtins*) fe) (pushd fe x)))) (defun register (voc key fn) (setf (gethash (string-downcase (symbol-name key)) voc) fn)) ; built-in primitives (defun reg-b (key fn) (register *builtins* key fn)) (reg-b 'add #'(lambda (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)))