- {env: IMPL=coffee, services: [docker]}
- {env: IMPL=cs, services: [docker]}
- {env: IMPL=chuck, services: [docker]}
- - {env: IMPL=clojure CLJ_MODE=clj, services: [docker]}
- - {env: IMPL=clojure CLJ_MODE=cljs, services: [docker]}
+ - {env: IMPL=clojure clojure_MODE=clj, services: [docker]}
+ - {env: IMPL=clojure clojure_MODE=cljs, services: [docker]}
- {env: IMPL=common-lisp, services: [docker]}
- {env: IMPL=crystal, services: [docker]}
- {env: IMPL=d, services: [docker]}
- {env: IMPL=gst, services: [docker]}
- {env: IMPL=guile, services: [docker]}
- {env: IMPL=haskell, services: [docker]}
+ - {env: IMPL=haxe haxe_MODE=neko, services: [docker]}
+ - {env: IMPL=haxe haxe_MODE=python, services: [docker]}
+ - {env: IMPL=haxe haxe_MODE=cpp, services: [docker]}
+ - {env: IMPL=haxe haxe_MODE=js, services: [docker]}
- {env: IMPL=haxe, services: [docker]}
- {env: IMPL=io, services: [docker]}
- {env: IMPL=java, services: [docker]}
# - {env: IMPL=plsql, services: [docker]}
- {env: IMPL=ps, services: [docker]}
- {env: IMPL=powershell, services: [docker]}
- - {env: IMPL=python, services: [docker]}
+ - {env: IMPL=python python_MODE=python2, services: [docker]}
+ - {env: IMPL=python python_MODE=python3, services: [docker]}
- {env: IMPL=r, services: [docker]}
- {env: IMPL=racket, services: [docker]}
- {env: IMPL=rexx, services: [docker]}
BUILD_IMPL=${BUILD_IMPL:-${IMPL}}
+mode_var=${MAL_IMPL}_MODE
+mode_val=${!mode_var}
+
# If NO_DOCKER is blank then launch use a docker image, otherwise
# use the Travis image/tools directly.
if [ -z "${NO_DOCKER}" ]; then
make -C ${BUILD_IMPL} step9_try || true
fi
docker run -it -u $(id -u) -v `pwd`:/mal kanaka/mal-test-${img_impl} \
- make CLJ_MODE=${CLJ_MODE} \
+ make ${mode_val:+${mode_var}=${mode_val}} \
-C ${BUILD_IMPL}
else
- make CLJ_MODE=${CLJ_MODE} \
+ make ${mode_val:+${mode_var}=${mode_val}} \
-C ${BUILD_IMPL}
fi
IMPL=${2}
MAL_IMPL=${3:-js}
+mode_var=${MAL_IMPL}_MODE
+mode_val=${!mode_var}
+
echo "ACTION: ${ACTION}"
echo "IMPL: ${IMPL}"
echo "MAL_IMPL: ${MAL_IMPL}"
${MAKE} TEST_OPTS="--debug-file ../${ACTION}.err" \
MAL_IMPL=${MAL_IMPL} \
- CLJ_MODE=${CLJ_MODE} \
+ ${mode_val:+${mode_var}=${mode_val}} \
${ACTION}^${IMPL}
# no failure so remove error log
MAL_IMPL = js
-PYTHON = python
-USE_MATLAB =
-# python, js, cpp, or neko are currently supported
-HAXE_MODE = neko
-# clj or cljs are currently supported (Clojure vs ClojureScript/lumo)
-CLJ_MODE = clj
+# clj or cljs (Clojure vs ClojureScript/lumo)
+clojure_MODE = clj
+# python, js, cpp, or neko
+haxe_MODE = neko
+# octave or matlab
+matlab_MODE = octave
+# python, python2 or python3
+python_MODE = python
# Extra options to pass to runtest.py
TEST_OPTS =
c_STEP_TO_PROG = c/$($(1))
d_STEP_TO_PROG = d/$($(1))
chuck_STEP_TO_PROG = chuck/$($(1)).ck
-clojure_STEP_TO_PROG = $(clojure_STEP_TO_PROG_$(CLJ_MODE))
+clojure_STEP_TO_PROG = $(clojure_STEP_TO_PROG_$(clojure_MODE))
coffee_STEP_TO_PROG = coffee/$($(1)).coffee
common-lisp_STEP_TO_PROG = common-lisp/$($(1))
cpp_STEP_TO_PROG = cpp/$($(1))
gst_STEP_TO_PROG = gst/$($(1)).st
java_STEP_TO_PROG = java/target/classes/mal/$($(1)).class
haskell_STEP_TO_PROG = haskell/$($(1))
-haxe_STEP_TO_PROG = $(haxe_STEP_TO_PROG_$(HAXE_MODE))
+haxe_STEP_TO_PROG = $(haxe_STEP_TO_PROG_$(haxe_MODE))
io_STEP_TO_PROG = io/$($(1)).io
julia_STEP_TO_PROG = julia/$($(1)).jl
js_STEP_TO_PROG = js/$($(1)).js
-it --rm -u $(shell id -u) \
-v $(dir $(abspath $(lastword $(MAKEFILE_LIST)))):/mal \
-w /mal/$(1) \
- $(if $(filter clojure,$(1)),-e CLJ_MODE=$(CLJ_MODE),) \
+ $(if $(strip $($(1)_MODE)),-e $(1)_MODE=$($(1)_MODE),) \
$(if $(filter factor,$(1)),-e FACTOR_ROOTS=$(FACTOR_ROOTS),) \
$(call impl_to_image,$(1)) \
,))
-it --rm -u $(shell id -u) \
-v $(dir $(abspath $(lastword $(MAKEFILE_LIST)))):/mal \
-w /mal/$(call actual_impl,$(1)) \
- $(if $(filter clojure,$(1)),-e CLJ_MODE=$(CLJ_MODE),) \
- $(if $(filter haxe,$(1)),-e HAXE_MODE=$(HAXE_MODE),) \
+ $(if $(strip $($(1)_MODE)),-e $(1)_MODE=$($(1)_MODE),) \
$(if $(filter factor,$(1)),-e FACTOR_ROOTS=$(FACTOR_ROOTS),) \
$(foreach env,$(3),-e $(env)) \
$(call impl_to_image,$(call actual_impl,$(1))) \
,\
env STEP=$($2) MAL_IMPL=$(MAL_IMPL) \
- $(if $(filter haxe,$(1)),HAXE_MODE=$(HAXE_MODE),) \
+ $(if $(strip $($(1)_MODE)),$(1)_MODE=$($(1)_MODE),) \
$(if $(filter factor,$(1)),FACTOR_ROOTS=$(FACTOR_ROOTS),) \
$(3)))
* C#
* ChucK
* Common Lisp
-* Clojure
+* Clojure (Clojure and ClojureScript)
* CoffeeScript
* Crystal
* D
* GNU Guile
* GNU Smalltalk
* Haskell
-* Haxe
+* Haxe (Neko, Python, C++ and JavaScript)
* Io
* Java
* JavaScript ([Online Demo](http://kanaka.github.io/mal))
* PL/SQL (Oracle)
* Postscript
* PowerShell
-* Python
+* Python (2.X and 3.X)
* RPython
* R
* Racket
./stepX_YYY
```
-### Haxe
+### Haxe (Neko, Python, C++ and JavaScript)
The Haxe implementation of mal requires Haxe version 3.2 to compile.
Four different Haxe targets are supported: Neko, Python, C++, and
powershell ./stepX_YYY.ps1
```
-### Python (2.X or 3.X)
+### Python (2.X and 3.X)
```
cd python
-CLJ_MODE ?= clj
-SOURCES_UTIL = src/mal/readline.$(CLJ_MODE)
+clojure_MODE ?= clj
+SOURCES_UTIL = src/mal/readline.$(clojure_MODE)
SOURCES_BASE = $(SOURCES_UTIL) src/mal/printer.cljc
SOURCES_LISP = src/mal/env.cljc src/mal/core.cljc src/mal/stepA_mal.cljc
SRCS = $(SOURCES_BASE) src/mal/env.cljc src/mal/core.cljc
SOURCES = $(SOURCES_BASE) $(SOURCES_LISP)
-DEPS = $(if $(filter cljs,$(CLJ_MODE)),node_modules,deps)
+DEPS = $(if $(filter cljs,$(clojure_MODE)),node_modules,deps)
dist: mal.jar mal
#!/bin/bash
export PATH=$PATH:$(dirname $0)/node_modules/.bin
STEP=${STEP:-stepA_mal}
-if [ "${CLJ_MODE}" = "cljs" ]; then
+if [ "${clojure_MODE}" = "cljs" ]; then
exec lumo -c $(dirname $0)/src -m mal.${STEP//_/-} "${@}"
else
exec java -jar $(dirname $0)/target/${STEP}.jar "${@}"
step4_if_fn_do step5_tco step6_file step7_quote \
step8_macros step9_try stepA_mal
-HAXE_DIST_MODE = neko
+haxe_MODE = neko
dist_neko = mal.n
dist_python = mal.py
dist_cpp = cpp/mal
cp $< $@
-mal: $(dist_$(HAXE_DIST_MODE))
- $(if $(filter cpp,$(HAXE_DIST_MODE)),\
+mal: $(dist_$(haxe_MODE))
+ $(if $(filter cpp,$(haxe_MODE)),\
cp $< $@;,\
- $(if $(filter neko,$(HAXE_DIST_MODE)),\
+ $(if $(filter neko,$(haxe_MODE)),\
nekotools boot $<;,\
- $(if $(filter js,$(HAXE_DIST_MODE)),\
+ $(if $(filter js,$(haxe_MODE)),\
echo "#!/usr/bin/env node" > $@;\
cat $< >> $@;,\
- $(if $(filter python,$(HAXE_DIST_MODE)),\
+ $(if $(filter python,$(haxe_MODE)),\
echo "#!/usr/bin/env python3" > $@;\
cat $< >> $@;,\
- $(error Invalid HAXE_DIST_MODE: $(HAXE_DIST_MODE))))))
+ $(error Invalid haxe_MODE: $(haxe_MODE))))))
chmod +x $@
#!/bin/bash
-case ${HAXE_MODE:-neko} in
+case ${haxe_MODE:-neko} in
neko) exec neko $(dirname $0)/${STEP:-stepA_mal}.n "${@}" ;;
python) exec python3 $(dirname $0)/${STEP:-stepA_mal}.py "${@}" ;;
js) exec node $(dirname $0)/${STEP:-stepA_mal}.js "${@}" ;;
cpp) exec $(dirname $0)/cpp/${STEP:-stepA_mal} "${@}" ;;
- *) echo "Invalid HAXE_MODE: ${HAXE_MODE}"; exit 2 ;;
+ *) echo "Invalid haxe_MODE: ${haxe_MODE}"; exit 2 ;;
esac
args="$args,'$a'"
done
fi
-if [ -n "$USE_MATLAB" ] ; then
+if [ "$matlab_MODE" = "matlab" ] ; then
exec matlab -nodisplay -nosplash -nodesktop -nojvm -r "${STEP:-stepA_mal}($args);quit;"
else
exec octave -q --no-gui --no-history --eval "${STEP:-stepA_mal}($args);quit;"
#!/bin/bash
-exec python $(dirname $0)/${STEP:-stepA_mal}.py "${@}"
+exec ${python_MODE:-python} $(dirname $0)/${STEP:-stepA_mal}.py "${@}"