| 1 | |
|---|
| 2 | |
|---|
| 3 | static char _bootScript[] = |
|---|
| 4 | "context! [\n" |
|---|
| 5 | " logic! 1 make :true\n" |
|---|
| 6 | " logic! 0 make :false\n" |
|---|
| 7 | " opcode! 0 'nop make :nop\n" |
|---|
| 8 | " opcode! 3 'drop make :drop\n" |
|---|
| 9 | " opcode! 4 'dup make :dup\n" |
|---|
| 10 | " opcode! 5 'dup2 make :dup2\n" |
|---|
| 11 | " opcode! 6 'over make :over\n" |
|---|
| 12 | " opcode! 7 'swap make :swap\n" |
|---|
| 13 | " opcode! 8 'nip make :nip\n" |
|---|
| 14 | " opcode! 9 'tuck make :tuck\n" |
|---|
| 15 | " opcode! 10 'rot make :rot\n" |
|---|
| 16 | " opcode! 11 'rot.r make :rot.r\n" |
|---|
| 17 | " opcode! 12 'do make :do\n" |
|---|
| 18 | " opcode! 13 'proc make :proc\n" |
|---|
| 19 | " opcode! 14 'iter make :iter\n" |
|---|
| 20 | " opcode! 15 'each make :each\n" |
|---|
| 21 | " opcode! 16 'recurse make :recurse\n" |
|---|
| 22 | " opcode! 17 'return make :return\n" |
|---|
| 23 | " opcode! 18 'throw make :throw\n" |
|---|
| 24 | " opcode! 19 'try make :try\n" |
|---|
| 25 | " opcode! 20 'ift make :ift\n" |
|---|
| 26 | " opcode! 21 'if-some make :if-some\n" |
|---|
| 27 | " opcode! 22 'iff make :iff\n" |
|---|
| 28 | " opcode! 23 'or-else make :or-else\n" |
|---|
| 29 | " opcode! 24 'if make :if\n" |
|---|
| 30 | " opcode! 25 'halt make :halt\n" |
|---|
| 31 | " opcode! 26 'quit make :quit\n" |
|---|
| 32 | " opcode! 27 'inc make :inc\n" |
|---|
| 33 | " opcode! 28 'dec make :dec\n" |
|---|
| 34 | " opcode! 29 '++ make :++\n" |
|---|
| 35 | " opcode! 30 '-- make :--\n" |
|---|
| 36 | " opcode! 31 'verify make :verify\n" |
|---|
| 37 | " opcode! 32 'forever make :forever\n" |
|---|
| 38 | " opcode! 33 'loop make :loop\n" |
|---|
| 39 | " int!/decimal! :number!\n" |
|---|
| 40 | " word!/set-word!/get-word!/lit-word! :any-word!\n" |
|---|
| 41 | " binary!/string!/block!/paren! :series!\n" |
|---|
| 42 | "] make :kernel-ops\n" |
|---|
| 43 | ; |
|---|
| 44 | |
|---|
| 45 | static char _envScript[] = |
|---|
| 46 | "logic! 1 make dup :yes :on\n" |
|---|
| 47 | "logic! 0 make dup :no :off\n" |
|---|
| 48 | "char! 9 make :tab\n" |
|---|
| 49 | "char! 10 make :eol\n" |
|---|
| 50 | "3.14159265358979323846 :pi\n" |
|---|
| 51 | "tail?: :empty?\n" |
|---|
| 52 | "[quit] proc :q\n" |
|---|
| 53 | "[block! swap make] proc :to-block\n" |
|---|
| 54 | "[string! to] proc :to-string\n" |
|---|
| 55 | "[context! swap make] proc :context\n" |
|---|
| 56 | "[\n" |
|---|
| 57 | " read\n" |
|---|
| 58 | " dup \"#!\" match ift (eol find)\n" |
|---|
| 59 | " to-block kernel-ops infuse\n" |
|---|
| 60 | "] proc :load ;(filename -- block)\n" |
|---|
| 61 | "[open swap string! to write close] proc :save ;(value filename -- )\n" |
|---|
| 62 | "[select if-some do] proc :case\n" |
|---|
| 63 | "['break throw] proc :break\n" |
|---|
| 64 | "[\n" |
|---|
| 65 | " [dup do iff break over do] forever\n" |
|---|
| 66 | " drop drop\n" |
|---|
| 67 | "]\n" |
|---|
| 68 | "'loop proc :while ;(block cond -- )\n" |
|---|
| 69 | "[body n number! limit number!] [\n" |
|---|
| 70 | " n\n" |
|---|
| 71 | " [[dup limit lt? iff break dup body do inc]\n" |
|---|
| 72 | " [dup limit gt? iff break dup body do dec]]\n" |
|---|
| 73 | " over limit lt? pick\n" |
|---|
| 74 | " forever drop\n" |
|---|
| 75 | "] 'loop func :loop.to\n" |
|---|
| 76 | "[ser words block! body block!]\n" |
|---|
| 77 | "[\n" |
|---|
| 78 | " ser [words set body do] words length? iter\n" |
|---|
| 79 | "]\n" |
|---|
| 80 | "'loop func :each.set ;(ser words body -- )\n" |
|---|
| 81 | "[ser comb] [\n" |
|---|
| 82 | " ser [dup first comb do 1 poke drop] iter\n" |
|---|
| 83 | "] 'loop func :map ;(ser comb -- )\n" |
|---|
| 84 | "[[do if-some return] each false] proc :any ; (blk -- logic)\n" |
|---|
| 85 | "[[do dup iff return drop] each true] proc :all ; (blk -- logic)\n" |
|---|
| 86 | "[ser old new | len] [\n" |
|---|
| 87 | " old length? :len\n" |
|---|
| 88 | " ser old find if-some (new len change :ser recurse)\n" |
|---|
| 89 | " ser\n" |
|---|
| 90 | "] func :replace.all ;(ser old new -- ser)\n" |
|---|
| 91 | "[reduce to-text console.out] proc :prin ;(val -- )\n" |
|---|
| 92 | "[reduce [first to-text console.out] iter] proc :prin.pack ;(val -- )\n" |
|---|
| 93 | "[reduce to-text console.out eol console.out] proc :print ;(val -- )\n" |
|---|
| 94 | "[error! swap make throw] proc :error\n" |
|---|
| 95 | "[swap context bind proc] proc :proc.env ;(env body -- proc)\n" |
|---|
| 96 | "[rot context bind func] proc :func.env ;(env sig body -- func)\n" |
|---|
| 97 | "[\n" |
|---|
| 98 | " [some none] copy swap 2 poke\n" |
|---|
| 99 | " parse\n" |
|---|
| 100 | " dup tail? iff (\n" |
|---|
| 101 | " \"parse.some failed at -^/\" copy\n" |
|---|
| 102 | " swap string! as 80 copy.part\n" |
|---|
| 103 | " append\n" |
|---|
| 104 | " error\n" |
|---|
| 105 | " ) drop\n" |
|---|
| 106 | "]\n" |
|---|
| 107 | "proc :parse.some ;(data rules -- )\n" |
|---|
| 108 | "[\n" |
|---|
| 109 | " 0,0,5 :version\n" |
|---|
| 110 | " none :os\n" |
|---|
| 111 | " [] :devices\n" |
|---|
| 112 | "]\n" |
|---|
| 113 | "context :script-env\n" |
|---|
| 114 | "[swap copy swap append head] proc :join ; (base addition -- new)\n" |
|---|
| 115 | "[val block!]\n" |
|---|
| 116 | "[\n" |
|---|
| 117 | " val dup empty? ift return\n" |
|---|
| 118 | " reduce\n" |
|---|
| 119 | " dup first\n" |
|---|
| 120 | " dup series! is-type? [copy] [to-text] either :val\n" |
|---|
| 121 | " next [\n" |
|---|
| 122 | " first val swap append drop\n" |
|---|
| 123 | " ] iter\n" |
|---|
| 124 | " val\n" |
|---|
| 125 | "] func :rejoin ; (block -- string)\n" |
|---|
| 126 | "[ser pat rep]\n" |
|---|
| 127 | "[\n" |
|---|
| 128 | " ser [dup first pat if/eq (rep 1 poke) drop] iter\n" |
|---|
| 129 | " ser\n" |
|---|
| 130 | "]\n" |
|---|
| 131 | "func :replace ; (ser pat rep -- ser)\n" |
|---|
| 132 | "[bind [dup second swap first set] iter/2] proc :set-key-values ; (blk ctx -- )\n" |
|---|
| 133 | "[now swap do now swap sub] proc :time-blk\n" |
|---|
| 134 | "[\n" |
|---|
| 135 | " dup [\n" |
|---|
| 136 | " \".\" [drop \"./\" none]\n" |
|---|
| 137 | " \"..\" [drop \"../\" none]\n" |
|---|
| 138 | " [\n" |
|---|
| 139 | " dup last '/' eq? ift (none return)\n" |
|---|
| 140 | " dup '/' find.last dup iff (swap return)\n" |
|---|
| 141 | " ; fullpath file\n" |
|---|
| 142 | " next\n" |
|---|
| 143 | " dup2 slice\n" |
|---|
| 144 | " rot.r nip\n" |
|---|
| 145 | " ]\n" |
|---|
| 146 | " ] case\n" |
|---|
| 147 | "] proc :split-path ; (fullpath -- path file)\n" |
|---|
| 148 | "[\n" |
|---|
| 149 | " dup last dup '/' if/eq (drop return)\n" |
|---|
| 150 | " '\\' if/eq return\n" |
|---|
| 151 | " '/' append head\n" |
|---|
| 152 | "] proc :dirize ; (path -- path)\n" |
|---|
| 153 | "[0 swap add] proc :to-dec\n" |
|---|
| 154 | "[rot minimum maximum] proc :limit ; (n min max -- n)\n" |
|---|
| 155 | "[blk | ctx num word]\n" |
|---|
| 156 | "[\n" |
|---|
| 157 | " [] context :ctx\n" |
|---|
| 158 | " blk [num word][\n" |
|---|
| 159 | " opcode! num word make word ctx set\n" |
|---|
| 160 | " ] each.set\n" |
|---|
| 161 | " ctx\n" |
|---|
| 162 | "] func :make-opcodes ; (block -- ctx)\n" |
|---|
| 163 | ; |
|---|