cl-scopes/forge/forge.lisp

43 lines
948 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 #: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)))