diff --git a/blah/Shakefile.hs b/blah/Shakefile.hs new file mode 100644 index 0000000..11019e8 --- /dev/null +++ b/blah/Shakefile.hs @@ -0,0 +1,23 @@ +import Development.Shake +import Development.Shake.Command +import Development.Shake.FilePath +import Development.Shake.Util + +main = shakeArgs shakeOptions $ do + action $ do + sourceFiles <- getDirectoryFiles "" ["//*.scm"] + need $ (-<.> "cps") <$> sourceFiles + alternatives $ do + "*.cps" %> \out -> do + let scm = out -<.> "scm" + need [scm] + Stdout cps0 <- cmd + "csc -debug 3" + [scm] + Stdout cps1 <- cmd + "sed -e" ["s/##core#lambda/κ/g;s/lambda/λ/g;/\\[cps\\]/d"] (Stdin cps0) + writeFile' out $ ";; -*- mode:scheme -*-\n" ++ cps1 + + phony "clean" $ do + removeFilesAfter ".shake" ["//*"] + liftIO $ removeFiles "." ["*.cps"] diff --git a/blah/factorial b/blah/factorial new file mode 100755 index 0000000..b3b193a Binary files /dev/null and b/blah/factorial differ diff --git a/blah/factorial.cps b/blah/factorial.cps new file mode 100644 index 0000000..5269139 --- /dev/null +++ b/blah/factorial.cps @@ -0,0 +1,31 @@ +;; -*- mode:scheme -*- +(λ (k118) + (let ((k119 (κ + (r120) + (let ((t11 r120)) + (let ((k122 (κ + (r123) + (let ((t12 r123)) + (let ((t125 (set! factorial + #f + (λ (k127 n10) + (let ((k128 (κ (r129) (k127 r129)))) + (let ((k131 (κ + (r132) + (if r132 + (k128 1) + (let ((k134 (κ (r135) (k128 r135)))) + (let ((k138 (κ + (r139) + (let ((a137 r139)) (scheme#* k134 n10 a137))))) + (let ((k142 (κ + (r143) + (let ((a141 r143)) (factorial k138 a141))))) + (scheme#- k142 n10 1)))))))) + (scheme#zero? k131 n10))))))) + (let ((t13 t125)) + (let ((k145 (κ (r146) (k118 r146)))) + (let ((k148 (κ (r149) (r149 k145)))) + (chicken.base#implicit-exit-handler k148))))))))) + (##core#callunit eval k122)))))) + (##core#callunit library k119))) diff --git a/blah/factorial.scm b/blah/factorial.scm new file mode 100644 index 0000000..2d9bfd4 --- /dev/null +++ b/blah/factorial.scm @@ -0,0 +1,4 @@ +(define (factorial n) + (if (zero? n) + 1 + (* n (factorial (- n 1))))) diff --git a/examples/wat/runtime/Shakefile.hs b/examples/wat/runtime/Shakefile.hs new file mode 100644 index 0000000..c9fb4cd --- /dev/null +++ b/examples/wat/runtime/Shakefile.hs @@ -0,0 +1,38 @@ +import Development.Shake +import Development.Shake.Command +import Development.Shake.FilePath +import Development.Shake.Util + +worldFor "program.wasm" = "gyehoek-program" +worldFor "runtime.wasm" = "gyehoek-runtime" + +main = shakeArgs shakeOptions $ do + want ["gyehoek.wasm"] + alternatives $ do + "gyehoek.wasm" %> \out -> do + need ["runtime.component.wasm","program.component.wasm"] + cmd_ + "wac plug --plug" + "runtime.component.wasm" "program.component.wasm" + "-o" "gyehoek.wasm" + "*.component.wasm" %> \out -> do + let wasm = out `replaceExtensions` "wasm" + need [wasm] + cmd_ + "wasm-tools component new" + [wasm] + "-o" [out] + "*.wasm" %> \out -> do + let wit = "gyehoek.wit" + let wat = out -<.> "wat" + need [wit,wat] + cmd_ + "wasm-tools component embed" + "-w" [worldFor out] + [wit] [wat] "-o" [out] + phony "run" $ do + need ["complete.component.wasm"] + cmd_ "wasmtime run --invoke add(1) complete.component.wasm" + phony "clean" $ do + removeFilesAfter ".shake" ["//*"] + liftIO $ removeFiles "." ["*.wasm"] diff --git a/examples/wat/runtime/gyehoek.wit b/examples/wat/runtime/gyehoek.wit new file mode 100644 index 0000000..79c96b5 --- /dev/null +++ b/examples/wat/runtime/gyehoek.wit @@ -0,0 +1,20 @@ +package gyehoek:gyehoek@0.1.0; + +interface runtime { + resource scm { + make-small-int: static func(n: s32) -> scm; + } +} + +interface program { + run: func() -> s32; +} + +world gyehoek-runtime { + export runtime; +} + +world gyehoek-program { + import runtime; + export program; +} \ No newline at end of file diff --git a/examples/wat/runtime/program.wat b/examples/wat/runtime/program.wat new file mode 100644 index 0000000..3ff7f6c --- /dev/null +++ b/examples/wat/runtime/program.wat @@ -0,0 +1,8 @@ +(module + (import "gyehoek:gyehoek/runtime@0.1.0" + "[static]scm.make-small-int" + (func $make-small-int (param i32) (result i32))) + (func $run (result i32) + (call $make-small-int (i32.const 123))) + (export "gyehoek:gyehoek/program@0.1.0#run" + (func $run))) diff --git a/examples/wat/runtime/runtime.wat b/examples/wat/runtime/runtime.wat new file mode 100644 index 0000000..f6c834d --- /dev/null +++ b/examples/wat/runtime/runtime.wat @@ -0,0 +1,5 @@ +(module + (func $make-small-int (param $n i32) (result i32) + (i32.mul (local.get $n) (i32.const 2))) + (export "gyehoek:gyehoek/runtime@0.1.0#[static]scm.make-small-int" + (func $make-small-int))) diff --git a/examples/wat/runtime/t.wat b/examples/wat/runtime/t.wat new file mode 100644 index 0000000..cdf89da --- /dev/null +++ b/examples/wat/runtime/t.wat @@ -0,0 +1,4 @@ +(component + (core module $main + (func (export "square") (param $n i32) (result i32) + (i32.mul (local.get $n) (local.get $n))))) diff --git a/flake.nix b/flake.nix index 81e85af..b469812 100644 --- a/flake.nix +++ b/flake.nix @@ -21,6 +21,7 @@ pkgs.wasm-tools pkgs.wac-cli inputs.ghc-wasm.packages.${system}.all_9_14 + pkgs.chicken ]; }; };