forge: const basically working; provide with-trace macro
This commit is contained in:
parent
52f9f7e3ed
commit
15fe5242f6
2 changed files with 28 additions and 22 deletions
|
@ -6,13 +6,17 @@
|
||||||
(:use :common-lisp)
|
(:use :common-lisp)
|
||||||
(:export #:*forge-env* #:setup-builtins #:activate-package
|
(:export #:*forge-env* #:setup-builtins #:activate-package
|
||||||
#:forge-env #:dstack #:exec #:exec-str #:repl
|
#:forge-env #:dstack #:exec #:exec-str #:repl
|
||||||
#:make-iseq #:isq-all #:isq-cur #:isq-next #:isq-end #:isq-add))
|
#:make-iseq #:isq-all #:isq-cur #:isq-next #:isq-end #:isq-add
|
||||||
|
#:with-trace))
|
||||||
|
|
||||||
(defpackage :sf-builtin)
|
(defpackage :sf-builtin)
|
||||||
(defpackage :sf-user)
|
(defpackage :sf-user)
|
||||||
|
|
||||||
(in-package :scopes/forge)
|
(in-package :scopes/forge)
|
||||||
|
|
||||||
|
(defmacro with-trace (&body body)
|
||||||
|
`(let ((*features* (cons :forge-trace *features*))) ,@body))
|
||||||
|
|
||||||
;;; iseq: iterable sequence
|
;;; iseq: iterable sequence
|
||||||
|
|
||||||
(defclass iseq ()
|
(defclass iseq ()
|
||||||
|
@ -85,14 +89,27 @@
|
||||||
`(register ',sym #'(lambda () ,@body)))
|
`(register ',sym #'(lambda () ,@body)))
|
||||||
|
|
||||||
(defun lit () (pushd (isq-next (fip))))
|
(defun lit () (pushd (isq-next (fip))))
|
||||||
|
(defun wrap () (pushd (list #'lit (popd))))
|
||||||
(defun defer () (comp-item (isq-next (fip))))
|
(defun defer () (comp-item (isq-next (fip))))
|
||||||
(defun do-pop () (comp-item #'lit) (comp-item (popd)))
|
|
||||||
|
|
||||||
(defun do-reg ()
|
(defun do-reg ()
|
||||||
(let* ((name (popd))
|
(let* ((name (popd))
|
||||||
(code (popd)))
|
(code (popd)))
|
||||||
(register name #'(lambda () (call code)))))
|
(register name #'(lambda () (call code)))))
|
||||||
|
|
||||||
|
(defun do-regc ()
|
||||||
|
(let* ((name (popd))
|
||||||
|
(code (popd)))
|
||||||
|
(register-comp-word name #'(lambda () (call code)))))
|
||||||
|
|
||||||
|
(defun do-quote () (comp-item #'lit) (comp-item (read-next)))
|
||||||
|
|
||||||
|
(defun do-comp ()
|
||||||
|
(let* ((sym (read-next))
|
||||||
|
(w (get-word sym)))
|
||||||
|
#+forge-trace (format t "~%do-comp ~a ~a ~a" sym w (gethash w (comp-words)))
|
||||||
|
(comp-item (gethash w (comp-words)))))
|
||||||
|
|
||||||
(defun setup-builtins ()
|
(defun setup-builtins ()
|
||||||
|
|
||||||
(reg + (pushd (+ (popd) (popd))))
|
(reg + (pushd (+ (popd) (popd))))
|
||||||
|
@ -102,24 +119,13 @@
|
||||||
(reg swap (let ((a (popd)) (b (popd))) (pushd a) (pushd b)))
|
(reg swap (let ((a (popd)) (b (popd))) (pushd a) (pushd b)))
|
||||||
|
|
||||||
(register 'lit #'lit)
|
(register 'lit #'lit)
|
||||||
|
(register 'wrap #'wrap)
|
||||||
(register 'defer #'defer)
|
(register 'defer #'defer)
|
||||||
(register 'pop #'do-pop)
|
|
||||||
(register 'reg #'do-reg)
|
(register 'reg #'do-reg)
|
||||||
|
(register 'regc #'do-regc)
|
||||||
|
|
||||||
(register 'regc
|
(register-comp-word 'quote #'do-quote)
|
||||||
#'(lambda ()
|
(register-comp-word 'comp #'do-comp)
|
||||||
(let* ((name (popd))
|
|
||||||
(code (popd)))
|
|
||||||
(register-comp-word name #'(lambda () (call code))))))
|
|
||||||
|
|
||||||
(register-comp-word 'quote
|
|
||||||
#'(lambda () (comp-item #'lit) (comp-item (read-next))))
|
|
||||||
|
|
||||||
(register-comp-word 'comp
|
|
||||||
#'(lambda () (let* ((sym (read-next))
|
|
||||||
(w (get-word sym)))
|
|
||||||
(format t "~%rcw: ~a ~a ~a" sym w (gethash w (comp-words)))
|
|
||||||
(comp-item (gethash w (comp-words))))))
|
|
||||||
|
|
||||||
(register-comp-word 'def
|
(register-comp-word 'def
|
||||||
#'(lambda ()
|
#'(lambda ()
|
||||||
|
@ -143,7 +149,7 @@
|
||||||
(call (comp code)))
|
(call (comp code)))
|
||||||
|
|
||||||
(defun call (code)
|
(defun call (code)
|
||||||
(print code)
|
#+forge-trace (print code)
|
||||||
(let ((old-ip (fip))
|
(let ((old-ip (fip))
|
||||||
(ip (make-iseq code)))
|
(ip (make-iseq code)))
|
||||||
(setf (slot-value *forge-env* 'ip) ip)
|
(setf (slot-value *forge-env* 'ip) ip)
|
||||||
|
@ -153,7 +159,7 @@
|
||||||
(setf (slot-value *forge-env* 'ip) old-ip)))
|
(setf (slot-value *forge-env* 'ip) old-ip)))
|
||||||
|
|
||||||
(defun comp (slist)
|
(defun comp (slist)
|
||||||
(print slist)
|
#+forge-trace (print slist)
|
||||||
(let ((cp (make-iseq))
|
(let ((cp (make-iseq))
|
||||||
(inp (make-iseq slist)))
|
(inp (make-iseq slist)))
|
||||||
(setf (slot-value *forge-env* 'cp) cp)
|
(setf (slot-value *forge-env* 'cp) cp)
|
||||||
|
@ -173,7 +179,7 @@
|
||||||
(defun comp-symbol (sym)
|
(defun comp-symbol (sym)
|
||||||
(let* ((w (get-word sym))
|
(let* ((w (get-word sym))
|
||||||
(comp-fn (gethash w (comp-words))))
|
(comp-fn (gethash w (comp-words))))
|
||||||
(format t "~%csym: ~a ~a ~a" sym w comp-fn)
|
;(format t "~%comp-symbol ~a ~a ~a" sym w comp-fn)
|
||||||
(if comp-fn
|
(if comp-fn
|
||||||
(funcall comp-fn)
|
(funcall comp-fn)
|
||||||
(comp-item (gethash w (words))))))
|
(comp-item (gethash w (words))))))
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
(== (car (forge:dstack)) 49))
|
(== (car (forge:dstack)) 49))
|
||||||
|
|
||||||
(deftest test-const ()
|
(deftest test-const ()
|
||||||
(forge:exec-str "(comp quote defer reg) quote const regc")
|
(forge:exec-str "(defer wrap comp quote defer reg) quote const regc")
|
||||||
(forge:exec-str "(11) const eleven")
|
(forge:exec-str "11 const eleven")
|
||||||
(forge:exec-str "eleven square")
|
(forge:exec-str "eleven square")
|
||||||
(== (car (forge:dstack)) 121))
|
(== (car (forge:dstack)) 121))
|
||||||
|
|
Loading…
Add table
Reference in a new issue