factor/library/tools/interpreter.factor

81 lines
2.0 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
USING: errors generic io kernel kernel-internals lists math
namespaces prettyprint sequences 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 ;
SYMBOL: meta-n
SYMBOL: meta-c
! Call frame
SYMBOL: meta-cf
! Currently executing word.
SYMBOL: meta-executing
! Callframe.
: up ( -- ) pop-r meta-cf set pop-r drop ;
: next ( -- obj )
2005-09-24 15:21:17 -04:00
meta-cf get [ meta-cf [ uncons ] change ] [ up next ] if ;
2005-06-15 23:27:28 -04:00
: meta-interp ( -- interp )
2005-09-18 23:22:58 -04:00
meta-d get f meta-r get meta-n get meta-c get
<continuation> ;
2005-06-15 23:27:28 -04:00
: set-meta-interp ( interp -- )
2005-09-18 23:22:58 -04:00
>continuation<
meta-c set meta-n set meta-r set drop meta-d set ;
2005-06-15 23:27:28 -04:00
: host-word ( word -- )
2005-06-15 23:27:28 -04:00
[
2005-09-24 23:21:09 -04:00
\ call push-r
[ continuation swap continue-with ] cons cons push-r
meta-interp continue
] callcc1 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 ;
2005-09-28 20:09:10 -04:00
GENERIC: do-1 ( object -- )
M: word do-1 ( word -- )
dup "meta-word" word-prop [ call ] [ host-word ] ?if ;
M: wrapper do-1 ( wrapper -- ) wrapped push-d ;
M: object do-1 ( object -- ) push-d ;
GENERIC: do ( obj -- )
M: word do ( 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
2005-09-24 15:21:17 -04:00
] if
] ?if ;
2005-09-28 20:09:10 -04:00
M: object do ( object -- ) do-1 ;
2005-03-10 17:57:22 -05:00
2005-09-28 20:09:10 -04:00
\ call [ pop-d meta-call ] "meta-word" set-word-prop
\ execute [ pop-d do ] "meta-word" set-word-prop
\ if [ pop-d pop-d pop-d [ nip ] [ drop ] if meta-call ] "meta-word" set-word-prop
\ dispatch [ pop-d pop-d swap nth meta-call ] "meta-word" set-word-prop