diff --git a/app/Compiler.hs b/app/Compiler.hs index ec19513..737ebe3 100644 --- a/app/Compiler.hs +++ b/app/Compiler.hs @@ -99,6 +99,18 @@ handleSymbol h (ZorthASTWord "dup") = do \ push rax\n" return () +handleSymbol h (ZorthASTWord "display") = do + liftIO $ hPutStr h + " push rsp\n\ + \ mov rbp, rsp\n\ + \ mov rax, 1\n\ + \ mov rdi, 1\n\ + \ mov rsi, [rbp]\n\ + \ mov rdx, 1\n\ + \ syscall\n\ + \ pop rsp\n\ + \ add rsp, 8\n" + return () handleSymbol h (ZorthASTWord "mem") = do liftIO $ hPutStr h @@ -172,7 +184,7 @@ handleSymbol h (ZorthASTWord "<=") = do handleSymbol h (ZorthASTWord w) = do state <- get - liftIO $ compileZorthAST h ((environment state) M.! w) state -- parent env to child and discard + _ <- compileZorthASTState h ((environment state) M.! w) -- parent env to child and discard return () handleSymbol _ (ZorthASTWordDecl (name,ast)) = do diff --git a/examples/69420.zorth b/examples/69420.zorth index 0a1d64d..038a96f 100644 --- a/examples/69420.zorth +++ b/examples/69420.zorth @@ -1,20 +1,20 @@ ( 69420 - a variation on FizzBuzz... but with 69 and 420 ) : over swap dup rot rot ; -: mod over over / * - ; +: rem over over / * - ; 1 begin dup 50< while - dup 15 mod 0 = if + dup 15 rem 0 = if 69420 . else - dup 3 mod 0 = if + dup 3 rem 0 = if 69 . else - dup 3 mod 0 = if + dup 3 rem 0 = if 420 . else dup . diff --git a/examples/rule110.zorth b/examples/rule110.zorth new file mode 100644 index 0000000..a646bd7 --- /dev/null +++ b/examples/rule110.zorth @@ -0,0 +1,89 @@ +( + rule110 celular automata - https://mathworld.wolfram.com/Rule110.html + proof of turing complentess of the language +) + +: over swap dup rot rot ; +: rem over over / * - ; +: mod dup rot swap rem swap dup rot + swap rem ; + +: generation + 0 + begin + dup 64 < + while + dup 8 * mem + 64 8 * + + swap + dup + dup 1+ 64 mod 8 * mem + @ + over 8 * mem + @ + rot 1- 64 mod 8 * mem + @ + + 0 = if + 0 = if + 0 = if + ( 0 0 0 ) + 32 display + swap dup 0 ! + else + ( 0 0 1 ) + 35 display + swap dup 1 ! + fi + else + 0 = if + ( 0 1 0 ) + 35 display + swap dup 1 ! + else + ( 0 1 1 ) + 35 display + swap dup 1 ! + fi + fi + else + 0 = if + 0 = if + ( 1 0 0 ) + 32 display + swap dup 0 ! + else + ( 1 0 1 ) + 35 display + swap dup 1 ! + fi + else + 0 = if + ( 1 1 0 ) + 35 display + swap dup 1 ! + else + ( 1 1 1 ) + 32 display + swap dup 0 ! + fi + fi + fi + drop + 1+ + repeat + 10 display + drop + 0 + begin + dup 64 < + while + dup 8 * dup mem 64 8 * + + @ mem rot + swap ! + 1+ + repeat + drop +; + +mem 32 8 * + 1 ! +0 +begin + dup 32 < +while + generation + 1+ +repeat