mirror of
https://github.com/urbit/ares.git
synced 2024-11-22 15:08:54 +03:00
ska spec: interpreter for linearized nock
This commit is contained in:
parent
f4da14c8cd
commit
25958a8402
156
docs/spec/ska/lib/run.hoon
Normal file
156
docs/spec/ska/lib/run.hoon
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
/- *gene
|
||||||
|
/+ degen
|
||||||
|
|%
|
||||||
|
++ real
|
||||||
|
|= [ject=* form=*]
|
||||||
|
=/ labl [[%gues ~] form]
|
||||||
|
=/ prog prog:+:(gene:degen labl)
|
||||||
|
(play ject prog labl)
|
||||||
|
++ play
|
||||||
|
|= [ject=* prog=tinn entr=labl]
|
||||||
|
^- *
|
||||||
|
=/ tend=* [[0 0] ject]
|
||||||
|
=| tack=(list [togo=linn rend=_tend])
|
||||||
|
=/ inst=linn
|
||||||
|
=/ entu (~(get by prog) entr)
|
||||||
|
?~ entu
|
||||||
|
~| 'No entry for given labl' !!
|
||||||
|
does.u.entu
|
||||||
|
|^
|
||||||
|
^- *
|
||||||
|
=^ next inst ~|(%empty-instruction-list ?>(?=(^ inst) inst))
|
||||||
|
?+ next ~|('TODO: full instruction set' !!)
|
||||||
|
[%don ~]
|
||||||
|
?~ tack
|
||||||
|
(gett 4) :: TODO pop stack
|
||||||
|
=/ res 4
|
||||||
|
=/ [pins=linn pend=_tend] -.tack
|
||||||
|
$:(putt 4 [0 0]):this(tend pend, inst pins, tack +.tack)
|
||||||
|
::
|
||||||
|
[%jmp *]
|
||||||
|
=/ entu (~(get by prog) entr)
|
||||||
|
?~ entu
|
||||||
|
~| 'No entry for given labl' !!
|
||||||
|
$:this(inst does.u.entu)
|
||||||
|
::
|
||||||
|
[%cal *]
|
||||||
|
=/ entu (~(get by prog) entr)
|
||||||
|
?~ entu
|
||||||
|
~| 'No entry for given labl' !!
|
||||||
|
=/ ject (gett 3)
|
||||||
|
=/ mend tend
|
||||||
|
=/ thin (putt 4 [0 0])
|
||||||
|
$:thin(tack [[inst mend] tack], inst does.u.entu)
|
||||||
|
::
|
||||||
|
[%lnt ~]
|
||||||
|
=/ dorm (gett 4)
|
||||||
|
=. prog prog:+:(gene:degen(prog prog) [[%gues ~] dorm])
|
||||||
|
=/ entu (~(get by prog) [[%gues ~] dorm])
|
||||||
|
?~ entu
|
||||||
|
~| 'No entry for given labl' !!
|
||||||
|
$:this(inst does.u.entu)
|
||||||
|
::
|
||||||
|
[%lnk ~]
|
||||||
|
=/ dorm (gett 4)
|
||||||
|
=. prog prog:+:(gene:degen(prog prog) [[%gues ~] dorm])
|
||||||
|
=/ entu (~(get by prog) entr)
|
||||||
|
?~ entu
|
||||||
|
~| 'No entry for given labl' !!
|
||||||
|
=/ ject (gett 3)
|
||||||
|
=/ mend tend
|
||||||
|
=/ thin (putt 4 [0 0])
|
||||||
|
$:thin(tack [[inst mend] tack], inst does.u.entu)
|
||||||
|
::
|
||||||
|
[%bom *]
|
||||||
|
~| 'Crashed on command' !!
|
||||||
|
::
|
||||||
|
[%imm * @]
|
||||||
|
$:(putt +>.next +<.next)
|
||||||
|
::
|
||||||
|
[%mov @ @]
|
||||||
|
$:(putt +>.next (gett +<.next))
|
||||||
|
::
|
||||||
|
[%clq * *]
|
||||||
|
?@ (gett 4)
|
||||||
|
$:(find +>.next)
|
||||||
|
$:(find +<.next)
|
||||||
|
::
|
||||||
|
[%inc @]
|
||||||
|
=/ ting (gett +.next)
|
||||||
|
?@ ting
|
||||||
|
$:(putt +.next .+(ting))
|
||||||
|
~| 'Increment of cell' !!
|
||||||
|
::
|
||||||
|
[%eqq * *]
|
||||||
|
?: =((gett 8) (gett 9))
|
||||||
|
$:(find +<.next)
|
||||||
|
$:(find +>.next)
|
||||||
|
::
|
||||||
|
[%brn * *]
|
||||||
|
=/ ting (gett 4)
|
||||||
|
?: =(ting 0)
|
||||||
|
$:(find +<.next)
|
||||||
|
?: =(ting 1)
|
||||||
|
$:(find +>.next)
|
||||||
|
~| 'Branch on something not a loobean' !!
|
||||||
|
::
|
||||||
|
[%hop *]
|
||||||
|
$:(find +.next)
|
||||||
|
::
|
||||||
|
[%her *]
|
||||||
|
~& 'Running over label'
|
||||||
|
$
|
||||||
|
::
|
||||||
|
[%sft ~]
|
||||||
|
(putt 5 (gett 2))
|
||||||
|
::
|
||||||
|
[%ust ~]
|
||||||
|
(putt 2 (gett 5))
|
||||||
|
==
|
||||||
|
++ this .
|
||||||
|
++ find
|
||||||
|
|= wher=dabl
|
||||||
|
^- _this
|
||||||
|
?~ inst
|
||||||
|
~| 'Empty instruction list' !!
|
||||||
|
?: ?= [%her *] -.inst
|
||||||
|
?: =(wher ->.inst)
|
||||||
|
this(inst +.inst)
|
||||||
|
$(inst +.inst)
|
||||||
|
$(inst +.inst)
|
||||||
|
++ gett
|
||||||
|
|= wher=@
|
||||||
|
^- *
|
||||||
|
?: =(1 wher)
|
||||||
|
tend
|
||||||
|
?@ tend
|
||||||
|
~| 'Get axis from atom' !!
|
||||||
|
?- (cap wher)
|
||||||
|
%2 $(wher (mas wher), tend -.tend)
|
||||||
|
%3 $(wher (mas wher), tend +.tend)
|
||||||
|
==
|
||||||
|
++ putt
|
||||||
|
|= [wher=@ what=*]
|
||||||
|
^- _this
|
||||||
|
%= this
|
||||||
|
tend
|
||||||
|
|-
|
||||||
|
?: =(1 wher)
|
||||||
|
what
|
||||||
|
?- (cap wher)
|
||||||
|
%2
|
||||||
|
?@ tend
|
||||||
|
:- $(wher (mas wher))
|
||||||
|
0
|
||||||
|
:- $(wher (mas wher), tend -.tend)
|
||||||
|
+.tend
|
||||||
|
%3
|
||||||
|
?@ tend
|
||||||
|
:- 0
|
||||||
|
$(wher (mas wher))
|
||||||
|
:- -.tend
|
||||||
|
$(wher (mas wher), tend +.tend)
|
||||||
|
==
|
||||||
|
==
|
||||||
|
--
|
||||||
|
--
|
Loading…
Reference in New Issue
Block a user