factor/library/tools/interpreter.factor

101 lines
2.7 KiB
Factor
Raw Normal View History

2005-02-17 16:10:35 -05:00
! Copyright (C) 2004, 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: interpreter
2005-06-12 21:52:36 -04:00
USING: errors kernel kernel-internals lists math namespaces
prettyprint sequences io strings vectors words ;
! A Factor interpreter written in Factor. Used by compiler for
2005-03-10 17:57:22 -05:00
! partial evaluation, also by the walker.
! Meta-stacks
SYMBOL: meta-r
2005-04-06 21:41:49 -04:00
: push-r meta-r get push ;
: pop-r meta-r get pop ;
SYMBOL: meta-d
2005-04-06 21:41:49 -04:00
: push-d meta-d get push ;
: pop-d meta-d get pop ;
: peek-d meta-d get peek ;
: peek-next-d meta-d get [ length 2 - ] keep nth ;
SYMBOL: meta-n
SYMBOL: meta-c
! Call frame
SYMBOL: meta-cf
! Currently executing word.
SYMBOL: meta-executing
: init-interpreter ( -- )
10 <vector> meta-r set
10 <vector> meta-d set
2004-11-21 19:27:18 -05:00
namestack meta-n set
2005-06-12 21:20:00 -04:00
catchstack meta-c set
f meta-cf set
f meta-executing set ;
: copy-interpreter ( -- )
#! Copy interpreter state from containing namespaces.
2005-01-28 23:55:22 -05:00
meta-r [ clone ] change
meta-d [ clone ] change
meta-n [ ] change
meta-c [ ] change ;
! Callframe.
: up ( -- ) pop-r meta-cf set pop-r drop ;
: next ( -- obj )
2004-12-10 21:39:27 -05:00
meta-cf get [ meta-cf [ uncons ] change ] [ up next ] ifte ;
2005-06-15 23:27:28 -04:00
: meta-interp ( -- interp )
meta-d get meta-r get meta-n get meta-c get <interp> ;
: set-meta-interp ( interp -- )
>interp< meta-c set meta-n set meta-r set meta-d set ;
: host-word ( word -- )
2005-06-15 23:27:28 -04:00
[
\ call push-r interp [
interp over interp-data push
set-interp
] cons cons push-r meta-interp set-interp
] call set-meta-interp pop-d 2drop ;
: meta-call ( quot -- )
#! Note we do tail call optimization here.
meta-cf [
[ meta-executing get push-r push-r ] when*
] change ;
: meta-word ( word -- )
dup "meta-word" word-prop [
2005-01-02 23:57:54 -05:00
call
] [
dup compound? [
dup word-def meta-call meta-executing set
] [
host-word
] ifte
2005-01-02 23:57:54 -05:00
] ?ifte ;
2005-03-10 17:57:22 -05:00
: do ( obj -- ) dup word? [ meta-word ] [ push-d ] ifte ;
2004-12-17 21:46:19 -05:00
: meta-word-1 ( word -- )
dup "meta-word" word-prop [ call ] [ host-word ] ?ifte ;
2004-12-17 21:46:19 -05:00
2005-03-10 17:57:22 -05:00
: do-1 ( obj -- ) dup word? [ meta-word-1 ] [ push-d ] ifte ;
2005-03-10 17:57:22 -05:00
: set-meta-word ( word quot -- ) "meta-word" set-word-prop ;
2005-01-28 23:55:22 -05:00
\ datastack [ meta-d get clone push-d ] set-meta-word
\ set-datastack [ pop-d clone meta-d set ] set-meta-word
2005-06-12 21:20:00 -04:00
\ >r [ pop-d push-r ] set-meta-word
\ r> [ pop-r push-d ] set-meta-word
2005-01-28 23:55:22 -05:00
\ callstack [ meta-r get clone push-d ] set-meta-word
\ set-callstack [ pop-d clone meta-r set ] set-meta-word
\ call [ pop-d meta-call ] set-meta-word
\ execute [ pop-d meta-word ] set-meta-word
\ ifte [ pop-d pop-d pop-d [ nip ] [ drop ] ifte meta-call ] set-meta-word
2005-06-12 21:52:36 -04:00
\ dispatch [ pop-d pop-d swap nth meta-call ] set-meta-word
2005-03-10 17:57:22 -05:00
\ set-meta-word forget