diff options
Diffstat (limited to 'lux-python/source')
-rw-r--r-- | lux-python/source/program.lux | 150 |
1 files changed, 108 insertions, 42 deletions
diff --git a/lux-python/source/program.lux b/lux-python/source/program.lux index 21dac4f04..5baf9db04 100644 --- a/lux-python/source/program.lux +++ b/lux-python/source/program.lux @@ -3,6 +3,7 @@ [cli (#+ program:)] ["." io (#+ IO io)] [control + pipe [monad (#+ do)] ["." exception (#+ exception:)]] [data @@ -24,6 +25,7 @@ [tool [compiler ["." name] + ["." synthesis] [phase [macro (#+ Expander)] ["." generation @@ -38,8 +40,13 @@ (import: #long java/lang/String) +(import: #long (java/lang/Class a) + (getCanonicalName [] java/lang/String)) + (import: #long java/lang/Object - (toString [] java/lang/String)) + (new []) + (toString [] java/lang/String) + (getClass [] (java/lang/Class java/lang/Object))) (import: #long java/lang/Integer (longValue [] java/lang/Long)) @@ -101,10 +108,19 @@ (import: #long org/python/core/PyType (getName [] java/lang/String)) +(import: #long org/python/core/PyNone) +(import: #long org/python/core/PyBoolean) +(import: #long org/python/core/PyInteger) +(import: #long org/python/core/PyLong) +(import: #long org/python/core/PyFloat) +(import: #long org/python/core/PyTuple) +(import: #long org/python/core/PyList) + (import: #long org/python/core/PyString (new [java/lang/String])) (import: #long org/python/core/PyObject + (asInt [] java/lang/Integer) (asLong [] long) (asDouble [] double) (asString [] java/lang/String) @@ -114,6 +130,13 @@ (__len__ [] int) (getType [] org/python/core/PyType)) +(import: #long org/python/core/PyFunction + (__call__ [(Array org/python/core/PyObject)] org/python/core/PyObject)) + +(import: #long org/python/core/PyArray + (new [(java/lang/Class java/lang/Object) java/lang/Object]) + (getArray [] java/lang/Object)) + (import: #long org/python/util/PythonInterpreter (new []) (exec [String] #try void) @@ -122,7 +145,7 @@ (type: Translator (-> org/python/core/PyObject (Error Any))) -(def: (tuple lux-object host-object) +(def: (read-tuple read host-object) (-> Translator Translator) (let [size (|> host-object org/python/core/PyObject::__len__ .nat)] (loop [idx 0 @@ -133,7 +156,7 @@ (#error.Failure error) (#error.Success value) - (case (lux-object value) + (case (read value) (#error.Failure error) (#error.Failure error) @@ -149,66 +172,109 @@ (exception.report ["Object" (java/lang/Object::toString object)])) -(def: tag-field (org/python/core/PyString::new runtime.variant-tag-field)) -(def: flag-field (org/python/core/PyString::new runtime.variant-flag-field)) -(def: value-field (org/python/core/PyString::new runtime.variant-value-field)) - -(def: (variant lux-object host-object) +(def: (read-variant read host-object) (-> Translator Translator) - (case [(org/python/core/PyObject::__getitem__dict tag-field host-object) - (org/python/core/PyObject::__getitem__dict flag-field host-object) - (org/python/core/PyObject::__getitem__dict value-field host-object)] + (case [(org/python/core/PyObject::__getitem__ +0 host-object) + (org/python/core/PyObject::__getitem__ +1 host-object) + (org/python/core/PyObject::__getitem__ +2 host-object)] (^or [(#error.Failure error) _ _] [_ (#error.Failure error) _] [_ _ (#error.Failure error)]) (#error.Failure error) (^multi [(#error.Success tag) (#error.Success flag) (#error.Success value)] - [(lux-object tag) + [(read tag) (#error.Success tag)] - [(lux-object value) + [(read value) (#error.Success value)]) - (#error.Success [(java/lang/Long::intValue (:coerce java/lang/Long tag)) + (#error.Success [tag (: Any - (case (python-type (:coerce org/python/core/PyObject flag)) - "NoneType" + (case (host.check org/python/core/PyNone flag) + (#.Some _) (host.null) - _ - "")) + #.None + synthesis.unit)) value]) _ (exception.throw ..unknown-kind-of-object host-object))) -(def: (lux-object host-object) +(def: (read host-object) Translator - (case (python-type host-object) - "str" - (#error.Success (org/python/core/PyObject::asString host-object)) - - "bool" - (#error.Success (org/python/core/PyObject::__nonzero__ host-object)) - - "float" - (#error.Success (org/python/core/PyObject::asDouble host-object)) + (`` (<| (~~ (do-template [<class> <processing>] + [(case (host.check <class> host-object) + (#.Some host-object) + (#error.Success (<| <processing> host-object)) + + _)] + + [org/python/core/PyNone (new> [] [])] + [org/python/core/PyBoolean org/python/core/PyObject::__nonzero__] + [org/python/core/PyInteger org/python/core/PyObject::asInt] + [org/python/core/PyLong org/python/core/PyObject::asLong] + [org/python/core/PyFloat org/python/core/PyObject::asDouble] + [org/python/core/PyString org/python/core/PyObject::asString] + [org/python/core/PyFunction (|>)] + [org/python/core/PyArray org/python/core/PyArray::getArray] + [(Array java/lang/Object) (|>)] + )) + (~~ (do-template [<class> <processing>] + [(case (host.check <class> host-object) + (#.Some host-object) + (<| <processing> host-object) + + _)] + + [org/python/core/PyTuple (..read-variant read)] + [org/python/core/PyList (..read-tuple read)] + )) + (exec (log! (java/lang/Class::getCanonicalName + (java/lang/Object::getClass + (:coerce java/lang/Object host-object)))) + (log! (python-type host-object)) + (exception.throw ..unknown-kind-of-object host-object))))) + +(exception: (cannot-apply-a-non-function {object java/lang/Object}) + (exception.report + ["Object" (java/lang/Object::toString object)])) - (^or "int" "long") - (#error.Success (org/python/core/PyObject::asLong host-object)) +(def: (ensure-macro macro) + (-> Macro (Maybe org/python/core/PyFunction)) + (host.check org/python/core/PyFunction (:coerce java/lang/Object macro))) - "tuple" - (..tuple lux-object host-object) +(def: object-class + (java/lang/Class java/lang/Object) + (java/lang/Object::getClass (java/lang/Object::new))) - "dict" - (..variant lux-object host-object) +(def: to-host + (-> Any org/python/core/PyObject) + (|>> (:coerce java/lang/Object) (org/python/core/PyArray::new ..object-class))) - "NoneType" - (#error.Success []) - - type - (exception.throw ..unknown-kind-of-object host-object))) +(def: (call-macro inputs lux macro) + (-> (List Code) Lux org/python/core/PyFunction (Error (Error [Lux (List Code)]))) + (<| (:coerce (Error (Error [Lux (List Code)]))) + ..read + (org/python/core/PyFunction::__call__ (|> (host.array org/python/core/PyObject 2) + (host.array-write 0 (..to-host inputs)) + (host.array-write 1 (..to-host lux))) + macro))) (def: (expander macro inputs lux) Expander - (#error.Failure "YOLO")) + (case (ensure-macro macro) + (#.Some macro) + (case (call-macro inputs lux macro) + (#error.Success output) + (|> output + (:coerce org/python/core/PyObject) + ..read + (:coerce (Error (Error [Lux (List Code)])))) + + (#error.Failure error) + (#error.Failure error)) + + #.None + (exception.throw cannot-apply-a-non-function (:coerce java/lang/Object macro))) + ) (def: separator "___") @@ -222,7 +288,7 @@ (function (evaluate! alias input) (do error.monad [output (org/python/util/PythonInterpreter::eval (_.code input) interpreter)] - (..lux-object output)))) + (..read output)))) execute! (: (-> Text (_.Statement Any) (Error Nothing)) (function (execute! alias input) (do error.monad @@ -257,7 +323,7 @@ (-> (_.Expression Any) (_.Statement Any)) ($_ _.then (_.import "sys") - (_.when (_.= (_.string "main") (_.var "__name__")) + (_.when (_.= (_.string "__main__") (_.var "__name__")) (_.statement (_.apply/2 program (runtime.lux//program-args (|> (_.var "sys") (_.the "argv"))) _.none))))) |