forge/sf: exec-item improvements, basic comp-item implementation
This commit is contained in:
parent
60cee40051
commit
b86005e111
1 changed files with 39 additions and 9 deletions
|
@ -7,13 +7,15 @@
|
||||||
(:local-nicknames (:iter :scopes/util/iter))
|
(:local-nicknames (:iter :scopes/util/iter))
|
||||||
(:export #:*input* #:*stack*
|
(:export #:*input* #:*stack*
|
||||||
#:exec-list #:exec-input
|
#:exec-list #:exec-input
|
||||||
#:reg #:reg2
|
#:lit #:reg #:reg2
|
||||||
#:pushd #:popd #:peekd))
|
#:pushd #:popd #:peekd))
|
||||||
|
|
||||||
(in-package :scopes/forge/sf)
|
(in-package :scopes/forge/sf)
|
||||||
|
|
||||||
(defvar *stack* nil)
|
(defvar *stack* nil)
|
||||||
(defvar *input* nil)
|
(defvar *input* nil)
|
||||||
|
(defvar *buffer* nil)
|
||||||
|
(defvar *code* nil)
|
||||||
|
|
||||||
;;;; core definitions
|
;;;; core definitions
|
||||||
|
|
||||||
|
@ -21,30 +23,53 @@
|
||||||
(:method ((it t))
|
(:method ((it t))
|
||||||
(pushd it))
|
(pushd it))
|
||||||
(:method ((it symbol))
|
(:method ((it symbol))
|
||||||
(call-item (symbol-value it))))
|
(exec-item (symbol-value it))))
|
||||||
|
|
||||||
(defgeneric comp-item (it))
|
(defgeneric comp-item (it)
|
||||||
|
(:method ((it t))
|
||||||
|
(push #'lit *buffer*)
|
||||||
|
(push it *buffer*))
|
||||||
|
(:method ((it symbol))
|
||||||
|
(comp-item (symbol-value it))))
|
||||||
|
|
||||||
(defgeneric call-item (it))
|
;;;; class word
|
||||||
|
|
||||||
(defclass word ()
|
(defclass word ()
|
||||||
((func :reader func :initarg :func)))
|
((func :reader func :initarg :func)))
|
||||||
|
|
||||||
(defmethod call-item ((w word))
|
(defmethod exec-item ((w word))
|
||||||
(funcall (func w)))
|
(funcall (func w)))
|
||||||
|
|
||||||
|
(defmethod comp-item ((w word))
|
||||||
|
(push (func w) *buffer*))
|
||||||
|
|
||||||
|
;;;; class comp-word
|
||||||
|
|
||||||
(defclass comp-word (word) ())
|
(defclass comp-word (word) ())
|
||||||
|
|
||||||
|
(defmethod comp-item ((w word))
|
||||||
|
(funcall (func w)))
|
||||||
|
|
||||||
|
;;;; functions
|
||||||
|
|
||||||
(defun exec-list (lst)
|
(defun exec-list (lst)
|
||||||
(setf *input* (make-instance 'iter:list-iterator :data lst))
|
(let ((*input* (make-instance 'iter:list-iterator :data lst)))
|
||||||
(exec-input))
|
(exec-input)))
|
||||||
|
|
||||||
(defun exec-input ()
|
(defun exec-input ()
|
||||||
(iter:process *input* #'exec-item))
|
(iter:process *input* #'exec-item))
|
||||||
|
|
||||||
|
(defun comp-input ()
|
||||||
|
(let ((*buffer* nil))
|
||||||
|
(iter:process *input* #'comp-item)
|
||||||
|
(pushd (reverse *buffer*))))
|
||||||
|
|
||||||
|
(defun call (code)
|
||||||
|
(let ((*code* (make-instance 'iter:list-iterator :data code)))
|
||||||
|
(iter:process *code* #'funcall)))
|
||||||
|
|
||||||
(defun reg (sym fn)
|
(defun reg (sym fn)
|
||||||
(setf (symbol-value sym) (make-instance 'word :func fn)))
|
(setf (symbol-value sym) (make-instance 'word :func fn)))
|
||||||
;(setf (symbol-value sym) fn))
|
|
||||||
|
|
||||||
(defun reg2 (sym fn)
|
(defun reg2 (sym fn)
|
||||||
(reg sym #'(lambda () (pushd (funcall fn (popd) (popd))))))
|
(reg sym #'(lambda () (pushd (funcall fn (popd) (popd))))))
|
||||||
|
@ -58,13 +83,16 @@
|
||||||
(defun peekd ()
|
(defun peekd ()
|
||||||
(car *stack*))
|
(car *stack*))
|
||||||
|
|
||||||
|
(defun lit ()
|
||||||
|
(pushd (iter:next-value *code*)))
|
||||||
|
|
||||||
;;;; builtins
|
;;;; builtins
|
||||||
|
|
||||||
(defpackage :sf-builtin
|
(defpackage :sf-builtin
|
||||||
(:use :common-lisp)
|
(:use :common-lisp)
|
||||||
(:local-nicknames (:f :scopes/forge/sf)
|
(:local-nicknames (:f :scopes/forge/sf)
|
||||||
(:iter :scopes/util/iter))
|
(:iter :scopes/util/iter))
|
||||||
(:export #:add #:mul #:dup #:in #:?))
|
(:export #:add #:mul #:dup #:in #:? #:lit))
|
||||||
|
|
||||||
(in-package :sf-builtin)
|
(in-package :sf-builtin)
|
||||||
|
|
||||||
|
@ -74,3 +102,5 @@
|
||||||
(f:reg 'dup #'(lambda () (f:pushd (f:peekd))))
|
(f:reg 'dup #'(lambda () (f:pushd (f:peekd))))
|
||||||
|
|
||||||
(f:reg 'in #'(lambda () (f:pushd (iter:next-value f:*input*))))
|
(f:reg 'in #'(lambda () (f:pushd (iter:next-value f:*input*))))
|
||||||
|
|
||||||
|
(f:reg 'lit #'f:lit)
|
||||||
|
|
Loading…
Add table
Reference in a new issue