diff --git a/Makefile b/Makefile index 20a66362..ee6d07ab 100644 --- a/Makefile +++ b/Makefile @@ -81,8 +81,8 @@ IMPLS = ada awk bash basic c d chuck clojure coffee common-lisp cpp crystal cs d erlang elisp elixir es6 factor forth fsharp go groovy gst guile haskell \ haxe io java julia js kotlin logo lua make mal ocaml matlab miniMAL \ nim objc objpascal perl perl6 php pil plpgsql plsql powershell ps \ - python r racket rexx rpython ruby rust scala skew swift swift3 tcl ts vb vhdl \ - vimscript livescript elm + python r racket rexx rpython ruby rust scala scm skew swift swift3 tcl \ + ts vb vhdl vimscript livescript elm EXTENSION = .mal @@ -208,6 +208,7 @@ rpython_STEP_TO_PROG = rpython/$($(1)) ruby_STEP_TO_PROG = ruby/$($(1)).rb rust_STEP_TO_PROG = rust/target/release/$($(1)) scala_STEP_TO_PROG = scala/target/scala-2.11/classes/$($(1)).class +scm_STEP_TO_PROG = scm/$($(1)).scm skew_STEP_TO_PROG = skew/$($(1)).js swift_STEP_TO_PROG = swift/$($(1)) swift3_STEP_TO_PROG = swift3/$($(1)) diff --git a/scm/Makefile b/scm/Makefile new file mode 100644 index 00000000..02e2630d --- /dev/null +++ b/scm/Makefile @@ -0,0 +1,17 @@ +SOURCES_BASE = reader.scm printer.scm types.scm +SOURCES_LISP = env.scm func.scm core.scm stepA_mal.scm +SOURCES = $(SOURCES_BASE) $(SOURCES_LISP) + +all: + +clean: + +.PHONY: stats tests $(TESTS) + +stats: $(SOURCES) + @wc $^ + @printf "%5s %5s %5s %s\n" `grep -E "^[[:space:]]*;|^[[:space:]]*$$" $^ | wc` "[comments/blanks]" +stats-lisp: $(SOURCES_LISP) + @wc $^ + @printf "%5s %5s %5s %s\n" `grep -E "^[[:space:]]*;|^[[:space:]]*$$" $^ | wc` "[comments/blanks]" + diff --git a/scm/run b/scm/run new file mode 100755 index 00000000..258c023b --- /dev/null +++ b/scm/run @@ -0,0 +1,12 @@ +#!/bin/bash +case ${SCM_MODE:-chibi} in + chibi) exec chibi-scheme $(dirname $0)/${STEP:-stepA_mal}.scm "${@}" ;; + kawa) exec kawa --r7rs $(dirname $0)/${STEP:-stepA_mal}.scm "${@}" ;; + chicken) exec csi -R r7rs -s $(dirname $0)/${STEP:-stepA_mal}.scm "${@}" ;; + gauche) exec gosh $(dirname $0)/${STEP:-stepA_mal}.scm "${@}" ;; + picrin) exec picrin $(dirname $0)/${STEP:-stepA_mal}.scm "${@}" ;; + sagittarius) exec sagittarius -n $(dirname $0)/${STEP:-stepA_mal}.scm "${@}" ;; + cyclone) exec icyc -s $(dirname $0)/${STEP:-stepA_mal}.scm "${@}" ;; + foment) exec foment $(dirname $0)/${STEP:-stepA_mal}.scm "${@}" ;; + *) echo "Invalid SCM_MODE: ${SCM_MODE}"; exit 2 ;; +esac diff --git a/scm/step0_repl.scm b/scm/step0_repl.scm new file mode 100644 index 00000000..c02c11ea --- /dev/null +++ b/scm/step0_repl.scm @@ -0,0 +1,33 @@ +(import (scheme base)) +(import (scheme write)) + +(define (READ input) + input) + +(define (EVAL input) + input) + +(define (PRINT input) + input) + +(define (rep input) + (PRINT (EVAL (READ input)))) + +(define (readline prompt) + (display prompt) + (flush-output-port) + (let ((input (read-line))) + (if (eof-object? input) + #f + input))) + +(define (main) + (let loop () + (let ((input (readline "user> "))) + (when input + (display (rep input)) + (newline) + (loop)))) + (newline)) + +(main)