diff options
author | Eduardo Julian | 2018-05-23 02:04:47 -0400 |
---|---|---|
committer | Eduardo Julian | 2018-05-23 02:04:47 -0400 |
commit | 72950a540be3dc49a107700c77c0195db16a4f58 (patch) | |
tree | 0f36aa21abad840e1a4a29215a5bfb9bb85659a7 /new-luxc/source/luxc/lang/extension/analysis/host.jvm.lux | |
parent | 14e96f5e5dad439383d63e60a52169cc2e7aaa5c (diff) |
- Migrated special-form analysis to stdlib.
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/lux/lang/extension/analysis/host.jvm.lux (renamed from new-luxc/source/luxc/lang/extension/analysis/host.jvm.lux) | 560 |
1 files changed, 283 insertions, 277 deletions
diff --git a/new-luxc/source/luxc/lang/extension/analysis/host.jvm.lux b/stdlib/source/lux/lang/extension/analysis/host.jvm.lux index 9ef06a4b1..31b811fac 100644 --- a/new-luxc/source/luxc/lang/extension/analysis/host.jvm.lux +++ b/stdlib/source/lux/lang/extension/analysis/host.jvm.lux @@ -1,5 +1,5 @@ (.module: - [lux #- char] + [lux #- char int] (lux (control [monad #+ do] ["p" parser] ["ex" exception #+ exception:]) @@ -17,31 +17,47 @@ [macro "macro/" Monad<Meta>] (macro [code] ["s" syntax]) + [lang] (lang [type] - (type ["tc" check])) + (type ["tc" check]) + [".L" analysis #+ Analysis] + (analysis [".A" type] + [".A" inference])) [host]) - (luxc ["&" lang] - (lang ["&." host] - ["la" analysis] - (analysis ["&." common] - [".A" inference]))) - ["@" //common] + ["/" //common] [///] ) +(host.import #long java/lang/reflect/Type + (getTypeName [] String)) + +(def: jvm-type-name + (-> java/lang/reflect/Type Text) + (java/lang/reflect/Type::getTypeName [])) + +(exception: #export (jvm-type-is-not-a-class {jvm-type java/lang/reflect/Type}) + (jvm-type-name jvm-type)) + (do-template [<name>] - [(exception: #export (<name> {message Text}) - message)] + [(exception: #export (<name> {type Type}) + (%type type))] - [Wrong-Syntax] + [non-object] + [non-array] + [non-jvm-type] + ) - [JVM-Type-Is-Not-Class] +(do-template [<name>] + [(exception: #export (<name> {name Text}) + name)] - [Non-Interface] - [Non-Object] - [Non-Array] - [Non-Throwable] - [Non-JVM-Type] + [non-interface] + [non-throwable] + ) + +(do-template [<name>] + [(exception: #export (<name> {message Text}) + message)] [Unknown-Class] [Primitives-Cannot-Have-Type-Parameters] @@ -69,11 +85,6 @@ [Cannot-Correspond-Type-With-Class] ) -(def: (wrong-syntax procedure args) - (-> Text (List Code) Text) - (format "Procedure: " procedure "\n" - "Arguments: " (%code (code.tuple args)))) - (do-template [<name> <class>] [(def: #export <name> Type (#.Primitive <class> (list)))] @@ -100,52 +111,52 @@ ) (def: conversion-procs - @.Bundle - (<| (@.prefix "convert") + /.Bundle + (<| (/.prefix "convert") (|> (dict.new text.Hash<Text>) - (@.install "double-to-float" (@.unary Double Float)) - (@.install "double-to-int" (@.unary Double Integer)) - (@.install "double-to-long" (@.unary Double Long)) - (@.install "float-to-double" (@.unary Float Double)) - (@.install "float-to-int" (@.unary Float Integer)) - (@.install "float-to-long" (@.unary Float Long)) - (@.install "int-to-byte" (@.unary Integer Byte)) - (@.install "int-to-char" (@.unary Integer Character)) - (@.install "int-to-double" (@.unary Integer Double)) - (@.install "int-to-float" (@.unary Integer Float)) - (@.install "int-to-long" (@.unary Integer Long)) - (@.install "int-to-short" (@.unary Integer Short)) - (@.install "long-to-double" (@.unary Long Double)) - (@.install "long-to-float" (@.unary Long Float)) - (@.install "long-to-int" (@.unary Long Integer)) - (@.install "long-to-short" (@.unary Long Short)) - (@.install "long-to-byte" (@.unary Long Byte)) - (@.install "char-to-byte" (@.unary Character Byte)) - (@.install "char-to-short" (@.unary Character Short)) - (@.install "char-to-int" (@.unary Character Integer)) - (@.install "char-to-long" (@.unary Character Long)) - (@.install "byte-to-long" (@.unary Byte Long)) - (@.install "short-to-long" (@.unary Short Long)) + (/.install "double-to-float" (/.unary Double Float)) + (/.install "double-to-int" (/.unary Double Integer)) + (/.install "double-to-long" (/.unary Double Long)) + (/.install "float-to-double" (/.unary Float Double)) + (/.install "float-to-int" (/.unary Float Integer)) + (/.install "float-to-long" (/.unary Float Long)) + (/.install "int-to-byte" (/.unary Integer Byte)) + (/.install "int-to-char" (/.unary Integer Character)) + (/.install "int-to-double" (/.unary Integer Double)) + (/.install "int-to-float" (/.unary Integer Float)) + (/.install "int-to-long" (/.unary Integer Long)) + (/.install "int-to-short" (/.unary Integer Short)) + (/.install "long-to-double" (/.unary Long Double)) + (/.install "long-to-float" (/.unary Long Float)) + (/.install "long-to-int" (/.unary Long Integer)) + (/.install "long-to-short" (/.unary Long Short)) + (/.install "long-to-byte" (/.unary Long Byte)) + (/.install "char-to-byte" (/.unary Character Byte)) + (/.install "char-to-short" (/.unary Character Short)) + (/.install "char-to-int" (/.unary Character Integer)) + (/.install "char-to-long" (/.unary Character Long)) + (/.install "byte-to-long" (/.unary Byte Long)) + (/.install "short-to-long" (/.unary Short Long)) ))) (do-template [<name> <prefix> <type>] [(def: <name> - @.Bundle - (<| (@.prefix <prefix>) + /.Bundle + (<| (/.prefix <prefix>) (|> (dict.new text.Hash<Text>) - (@.install "+" (@.binary <type> <type> <type>)) - (@.install "-" (@.binary <type> <type> <type>)) - (@.install "*" (@.binary <type> <type> <type>)) - (@.install "/" (@.binary <type> <type> <type>)) - (@.install "%" (@.binary <type> <type> <type>)) - (@.install "=" (@.binary <type> <type> Boolean)) - (@.install "<" (@.binary <type> <type> Boolean)) - (@.install "and" (@.binary <type> <type> <type>)) - (@.install "or" (@.binary <type> <type> <type>)) - (@.install "xor" (@.binary <type> <type> <type>)) - (@.install "shl" (@.binary <type> Integer <type>)) - (@.install "shr" (@.binary <type> Integer <type>)) - (@.install "ushr" (@.binary <type> Integer <type>)) + (/.install "+" (/.binary <type> <type> <type>)) + (/.install "-" (/.binary <type> <type> <type>)) + (/.install "*" (/.binary <type> <type> <type>)) + (/.install "/" (/.binary <type> <type> <type>)) + (/.install "%" (/.binary <type> <type> <type>)) + (/.install "=" (/.binary <type> <type> Boolean)) + (/.install "<" (/.binary <type> <type> Boolean)) + (/.install "and" (/.binary <type> <type> <type>)) + (/.install "or" (/.binary <type> <type> <type>)) + (/.install "xor" (/.binary <type> <type> <type>)) + (/.install "shl" (/.binary <type> Integer <type>)) + (/.install "shr" (/.binary <type> Integer <type>)) + (/.install "ushr" (/.binary <type> Integer <type>)) )))] [int-procs "int" Integer] @@ -154,16 +165,16 @@ (do-template [<name> <prefix> <type>] [(def: <name> - @.Bundle - (<| (@.prefix <prefix>) + /.Bundle + (<| (/.prefix <prefix>) (|> (dict.new text.Hash<Text>) - (@.install "+" (@.binary <type> <type> <type>)) - (@.install "-" (@.binary <type> <type> <type>)) - (@.install "*" (@.binary <type> <type> <type>)) - (@.install "/" (@.binary <type> <type> <type>)) - (@.install "%" (@.binary <type> <type> <type>)) - (@.install "=" (@.binary <type> <type> Boolean)) - (@.install "<" (@.binary <type> <type> Boolean)) + (/.install "+" (/.binary <type> <type> <type>)) + (/.install "-" (/.binary <type> <type> <type>)) + (/.install "*" (/.binary <type> <type> <type>)) + (/.install "/" (/.binary <type> <type> <type>)) + (/.install "%" (/.binary <type> <type> <type>)) + (/.install "=" (/.binary <type> <type> Boolean)) + (/.install "<" (/.binary <type> <type> Boolean)) )))] [float-procs "float" Float] @@ -171,11 +182,11 @@ ) (def: char-procs - @.Bundle - (<| (@.prefix "char") + /.Bundle + (<| (/.prefix "char") (|> (dict.new text.Hash<Text>) - (@.install "=" (@.binary Character Character Boolean)) - (@.install "<" (@.binary Character Character Boolean)) + (/.install "=" (/.binary Character Character Boolean)) + (/.install "<" (/.binary Character Character Boolean)) ))) (def: #export boxes @@ -190,28 +201,28 @@ ["char" "java.lang.Character"]) (dict.from-list text.Hash<Text>))) -(def: (array-length proc) +(def: (array//length proc) (-> Text ///.Analysis) (function (_ analyse eval args) (case args (^ (list arrayC)) (do macro.Monad<Meta> - [_ (&.infer Nat) - [var-id varT] (&.with-type-env tc.var) - arrayA (&.with-type (type (Array varT)) + [_ (typeA.infer Nat) + [var-id varT] (typeA.with-env tc.var) + arrayA (typeA.with-type (type (Array varT)) (analyse arrayC))] - (wrap (la.procedure proc (list arrayA)))) + (wrap (#analysisL.Special proc (list arrayA)))) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +1 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +1 (list.size args)])))) -(def: (array-new proc) +(def: (array//new proc) (-> Text ///.Analysis) (function (_ analyse eval args) (case args (^ (list lengthC)) (do macro.Monad<Meta> - [lengthA (&.with-type Nat + [lengthA (typeA.with-type Nat (analyse lengthC)) expectedT macro.expected-type [level elem-class] (: (Meta [Nat Text]) @@ -224,23 +235,25 @@ (recur outputT level) #.None - (&.throw Non-Array (%type expectedT))) + (lang.throw non-array expectedT)) (^ (#.Primitive "#Array" (list elemT))) - (recur elemT (n/inc level)) + (recur elemT (inc level)) (#.Primitive class _) (wrap [level class]) _ - (&.throw Non-Array (%type expectedT))))) + (lang.throw non-array expectedT)))) _ (if (n/> +0 level) (wrap []) - (&.throw Non-Array (%type expectedT)))] - (wrap (la.procedure proc (list (code.nat (n/dec level)) (code.text elem-class) lengthA)))) + (lang.throw non-array expectedT))] + (wrap (#analysisL.Special proc (list (analysisL.nat (dec level)) + (analysisL.text elem-class) + lengthA)))) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +1 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +1 (list.size args)])))) (def: (check-jvm objectT) (-> Type (Meta Text)) @@ -266,17 +279,17 @@ (check-jvm outputT) #.None - (&.throw Non-Object (%type objectT))) + (lang.throw non-object objectT)) _ - (&.throw Non-Object (%type objectT)))) + (lang.throw non-object objectT))) (def: (check-object objectT) (-> Type (Meta Text)) (do macro.Monad<Meta> [name (check-jvm objectT)] (if (dict.contains? name boxes) - (&.throw Primitives-Are-Not-Objects name) + (lang.throw Primitives-Are-Not-Objects name) (macro/wrap name)))) (def: (box-array-element-type elemT) @@ -290,62 +303,62 @@ (#.Primitive name _) (if (dict.contains? name boxes) - (&.throw Primitives-Cannot-Have-Type-Parameters name) + (lang.throw Primitives-Cannot-Have-Type-Parameters name) (macro/wrap [elemT name])) _ - (&.throw Invalid-Type-For-Array-Element (%type elemT)))) + (lang.throw Invalid-Type-For-Array-Element (%type elemT)))) -(def: (array-read proc) +(def: (array//read proc) (-> Text ///.Analysis) (function (_ analyse eval args) (case args (^ (list arrayC idxC)) (do macro.Monad<Meta> - [[var-id varT] (&.with-type-env tc.var) - _ (&.infer varT) - arrayA (&.with-type (type (Array varT)) + [[var-id varT] (typeA.with-env tc.var) + _ (typeA.infer varT) + arrayA (typeA.with-type (type (Array varT)) (analyse arrayC)) - ?elemT (&.with-type-env + ?elemT (typeA.with-env (tc.read var-id)) [elemT elem-class] (box-array-element-type (maybe.default varT ?elemT)) - idxA (&.with-type Nat + idxA (typeA.with-type Nat (analyse idxC))] - (wrap (la.procedure proc (list (code.text elem-class) idxA arrayA)))) + (wrap (#analysisL.Special proc (list (analysisL.text elem-class) idxA arrayA)))) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +2 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +2 (list.size args)])))) -(def: (array-write proc) +(def: (array//write proc) (-> Text ///.Analysis) (function (_ analyse eval args) (case args (^ (list arrayC idxC valueC)) (do macro.Monad<Meta> - [[var-id varT] (&.with-type-env tc.var) - _ (&.infer (type (Array varT))) - arrayA (&.with-type (type (Array varT)) + [[var-id varT] (typeA.with-env tc.var) + _ (typeA.infer (type (Array varT))) + arrayA (typeA.with-type (type (Array varT)) (analyse arrayC)) - ?elemT (&.with-type-env + ?elemT (typeA.with-env (tc.read var-id)) [valueT elem-class] (box-array-element-type (maybe.default varT ?elemT)) - idxA (&.with-type Nat + idxA (typeA.with-type Nat (analyse idxC)) - valueA (&.with-type valueT + valueA (typeA.with-type valueT (analyse valueC))] - (wrap (la.procedure proc (list (code.text elem-class) idxA valueA arrayA)))) + (wrap (#analysisL.Special proc (list (analysisL.text elem-class) idxA valueA arrayA)))) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +3 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +3 (list.size args)])))) (def: array-procs - @.Bundle - (<| (@.prefix "array") + /.Bundle + (<| (/.prefix "array") (|> (dict.new text.Hash<Text>) - (@.install "length" array-length) - (@.install "new" array-new) - (@.install "read" array-read) - (@.install "write" array-write) + (/.install "length" array//length) + (/.install "new" array//new) + (/.install "read" array//read) + (/.install "write" array//write) ))) (def: (object//null proc) @@ -356,10 +369,10 @@ (do macro.Monad<Meta> [expectedT macro.expected-type _ (check-object expectedT)] - (wrap (la.procedure proc (list)))) + (wrap (#analysisL.Special proc (list)))) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +0 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +0 (list.size args)])))) (def: (object//null? proc) (-> Text ///.Analysis) @@ -367,14 +380,14 @@ (case args (^ (list objectC)) (do macro.Monad<Meta> - [_ (&.infer Bool) - [objectT objectA] (&common.with-unknown-type + [_ (typeA.infer Bool) + [objectT objectA] (typeA.with-inference (analyse objectC)) _ (check-object objectT)] - (wrap (la.procedure proc (list objectA)))) + (wrap (#analysisL.Special proc (list objectA)))) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +1 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +1 (list.size args)])))) (def: (object//synchronized proc) (-> Text ///.Analysis) @@ -382,23 +395,20 @@ (case args (^ (list monitorC exprC)) (do macro.Monad<Meta> - [[monitorT monitorA] (&common.with-unknown-type + [[monitorT monitorA] (typeA.with-inference (analyse monitorC)) _ (check-object monitorT) exprA (analyse exprC)] - (wrap (la.procedure proc (list monitorA exprA)))) + (wrap (#analysisL.Special proc (list monitorA exprA)))) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +2 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +2 (list.size args)])))) (host.import java/lang/Object (equals [Object] boolean)) (host.import java/lang/ClassLoader) -(host.import #long java/lang/reflect/Type - (getTypeName [] String)) - (host.import java/lang/reflect/GenericArrayType (getGenericComponentType [] java/lang/reflect/Type)) @@ -444,7 +454,7 @@ (host.import (java/lang/Class c) (getName [] String) (getModifiers [] int) - (#static forName [String boolean ClassLoader] #try (Class Object)) + (#static forName [String] #try (Class Object)) (isAssignableFrom [(Class Object)] boolean) (getTypeParameters [] (Array (TypeVariable (Class c)))) (getGenericInterfaces [] (Array java/lang/reflect/Type)) @@ -456,13 +466,13 @@ (def: (load-class name) (-> Text (Meta (Class Object))) (do macro.Monad<Meta> - [class-loader &host.class-loader] - (case (Class::forName [name false class-loader]) + [] + (case (Class::forName [name]) (#e.Success [class]) (wrap class) (#e.Error error) - (&.throw Unknown-Class name)))) + (lang.throw Unknown-Class name)))) (def: (sub-class? super sub) (-> Text Text (Meta Bool)) @@ -477,19 +487,19 @@ (case args (^ (list exceptionC)) (do macro.Monad<Meta> - [_ (&.infer Nothing) - [exceptionT exceptionA] (&common.with-unknown-type + [_ (typeA.infer Nothing) + [exceptionT exceptionA] (typeA.with-inference (analyse exceptionC)) exception-class (check-object exceptionT) ? (sub-class? "java.lang.Throwable" exception-class) _ (: (Meta Any) (if ? (wrap []) - (&.throw Non-Throwable exception-class)))] - (wrap (la.procedure proc (list exceptionA)))) + (lang.throw non-throwable exception-class)))] + (wrap (#analysisL.Special proc (list exceptionA)))) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +1 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +1 (list.size args)])))) (def: (object//class proc) (-> Text ///.Analysis) @@ -499,15 +509,15 @@ (case classC [_ (#.Text class)] (do macro.Monad<Meta> - [_ (&.infer (#.Primitive "java.lang.Class" (list (#.Primitive class (list))))) + [_ (typeA.infer (#.Primitive "java.lang.Class" (list (#.Primitive class (list))))) _ (load-class class)] - (wrap (la.procedure proc (list (code.text class))))) + (wrap (#analysisL.Special proc (list (analysisL.text class))))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))) + (lang.throw /.invalid-syntax [proc args])) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +1 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +1 (list.size args)])))) (def: (object//instance? proc) (-> Text ///.Analysis) @@ -517,24 +527,20 @@ (case classC [_ (#.Text class)] (do macro.Monad<Meta> - [_ (&.infer Bool) - [objectT objectA] (&common.with-unknown-type + [_ (typeA.infer Bool) + [objectT objectA] (typeA.with-inference (analyse objectC)) object-class (check-object objectT) ? (sub-class? class object-class)] (if ? - (wrap (la.procedure proc (list (code.text class)))) - (&.throw Cannot-Possibly-Be-Instance (format object-class " !<= " class)))) + (wrap (#analysisL.Special proc (list (analysisL.text class)))) + (lang.throw Cannot-Possibly-Be-Instance (format object-class " !<= " class)))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))) + (lang.throw /.invalid-syntax [proc args])) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +2 (list.size args)))))) - -(def: type-descriptor - (-> java/lang/reflect/Type Text) - (java/lang/reflect/Type::getTypeName [])) + (lang.throw /.incorrect-special-arity [proc +2 (list.size args)])))) (def: (java-type-to-class type) (-> java/lang/reflect/Type (Meta Text)) @@ -545,7 +551,7 @@ (java-type-to-class (ParameterizedType::getRawType [] (:! ParameterizedType type))) ## else - (&.throw Cannot-Convert-To-Class (type-descriptor type)))) + (lang.throw Cannot-Convert-To-Class (jvm-type-name type)))) (type: Mappings (Dict Text Type)) @@ -561,7 +567,7 @@ (macro/wrap var-type) #.None - (&.throw Unknown-Type-Var var-name))) + (lang.throw Unknown-Type-Var var-name))) (host.instance? WildcardType java-type) (let [java-type (:! WildcardType java-type)] @@ -581,9 +587,9 @@ (#.Primitive class-name (list)) arity - (|> (list.n/range +0 (n/dec arity)) + (|> (list.n/range +0 (dec arity)) list.reverse - (list/map (|>> (n/* +2) n/inc #.Bound)) + (list/map (|>> (n/* +2) inc #.Bound)) (#.Primitive class-name) (type.univ-q arity))))) @@ -598,7 +604,7 @@ (monad.map @ (java-type-to-lux-type mappings)))] (macro/wrap (#.Primitive (Class::getName [] (:! (Class Object) raw)) paramsT))) - (&.throw JVM-Type-Is-Not-Class (type-descriptor raw)))) + (lang.throw jvm-type-is-not-a-class raw))) (host.instance? GenericArrayType java-type) (do macro.Monad<Meta> @@ -608,7 +614,7 @@ (wrap (#.Primitive "#Array" (list innerT)))) ## else - (&.throw Cannot-Convert-To-Lux-Type (type-descriptor java-type)))) + (lang.throw Cannot-Convert-To-Lux-Type (jvm-type-name java-type)))) (def: (correspond-type-params class type) (-> (Class Object) Type (Meta Mappings)) @@ -619,16 +625,16 @@ num-class-params (list.size class-params) num-type-params (list.size params)] (cond (not (text/= class-name name)) - (&.throw Cannot-Correspond-Type-With-Class - (format "Class = " class-name "\n" - "Type = " (%type type))) + (lang.throw Cannot-Correspond-Type-With-Class + (format "Class = " class-name "\n" + "Type = " (%type type))) (not (n/= num-class-params num-type-params)) - (&.throw Type-Parameter-Mismatch - (format "Expected: " (%i (nat-to-int num-class-params)) "\n" - " Actual: " (%i (nat-to-int num-type-params)) "\n" - " Class: " class-name "\n" - " Type: " (%type type))) + (lang.throw Type-Parameter-Mismatch + (format "Expected: " (%i (.int num-class-params)) "\n" + " Actual: " (%i (.int num-type-params)) "\n" + " Class: " class-name "\n" + " Type: " (%type type))) ## else (macro/wrap (|> params @@ -637,7 +643,7 @@ )) _ - (&.throw Non-JVM-Type (%type type)))) + (lang.throw non-jvm-type type))) (def: (object//cast proc) (-> Text ///.Analysis) @@ -647,7 +653,7 @@ (do macro.Monad<Meta> [toT macro.expected-type to-name (check-jvm toT) - [valueT valueA] (&common.with-unknown-type + [valueT valueA] (typeA.with-inference (analyse valueC)) from-name (check-jvm valueT) can-cast? (: (Meta Bool) @@ -656,7 +662,7 @@ (^or [<primitive> <object>] [<object> <primitive>]) (do @ - [_ (&.infer (#.Primitive to-name (list)))] + [_ (typeA.infer (#.Primitive to-name (list)))] (wrap true))) (["boolean" "java.lang.Boolean"] ["byte" "java.lang.Byte"] @@ -669,22 +675,22 @@ _ (do @ - [_ (&.assert Primitives-Are-Not-Objects from-name - (not (dict.contains? from-name boxes))) - _ (&.assert Primitives-Are-Not-Objects to-name - (not (dict.contains? to-name boxes))) + [_ (lang.assert Primitives-Are-Not-Objects from-name + (not (dict.contains? from-name boxes))) + _ (lang.assert Primitives-Are-Not-Objects to-name + (not (dict.contains? to-name boxes))) to-class (load-class to-name)] (loop [[current-name currentT] [from-name valueT]] (if (text/= to-name current-name) (do @ - [_ (&.infer toT)] + [_ (typeA.infer toT)] (wrap true)) (do @ [current-class (load-class current-name) - _ (&.assert Cannot-Cast (format "From class/primitive: " current-name "\n" - " To class/primitive: " to-name "\n" - " For value: " (%code valueC) "\n") - (Class::isAssignableFrom [current-class] to-class)) + _ (lang.assert Cannot-Cast (format "From class/primitive: " current-name "\n" + " To class/primitive: " to-name "\n" + " For value: " (%code valueC) "\n") + (Class::isAssignableFrom [current-class] to-class)) candiate-parents (monad.map @ (function (_ java-type) (do @ @@ -703,32 +709,32 @@ (recur [next-name nextT])) #.Nil - (&.throw Cannot-Cast (format "From class/primitive: " from-name "\n" - " To class/primitive: " to-name "\n" - " For value: " (%code valueC) "\n"))) + (lang.throw Cannot-Cast (format "From class/primitive: " from-name "\n" + " To class/primitive: " to-name "\n" + " For value: " (%code valueC) "\n"))) ))))))] (if can-cast? - (wrap (la.procedure proc (list (code.text from-name) - (code.text to-name) - valueA))) - (&.throw Cannot-Cast (format "From class/primitive: " from-name "\n" - " To class/primitive: " to-name "\n" - " For value: " (%code valueC) "\n")))) + (wrap (#analysisL.Special proc (list (analysisL.text from-name) + (analysisL.text to-name) + valueA))) + (lang.throw Cannot-Cast (format "From class/primitive: " from-name "\n" + " To class/primitive: " to-name "\n" + " For value: " (%code valueC) "\n")))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))))) + (lang.throw /.invalid-syntax [proc args])))) (def: object-procs - @.Bundle - (<| (@.prefix "object") + /.Bundle + (<| (/.prefix "object") (|> (dict.new text.Hash<Text>) - (@.install "null" object//null) - (@.install "null?" object//null?) - (@.install "synchronized" object//synchronized) - (@.install "throw" object//throw) - (@.install "class" object//class) - (@.install "instance?" object//instance?) - (@.install "cast" object//cast) + (/.install "null" object//null) + (/.install "null?" object//null?) + (/.install "synchronized" object//synchronized) + (/.install "throw" object//throw) + (/.install "class" object//class) + (/.install "instance?" object//instance?) + (/.install "cast" object//cast) ))) (def: (find-field class-name field-name) @@ -740,13 +746,13 @@ (let [owner (Field::getDeclaringClass [] field)] (if (is? owner class) (wrap [class field]) - (&.throw Mistaken-Field-Owner - (format " Field: " field-name "\n" - " Owner Class: " (Class::getName [] owner) "\n" - "Target Class: " class-name "\n")))) + (lang.throw Mistaken-Field-Owner + (format " Field: " field-name "\n" + " Owner Class: " (Class::getName [] owner) "\n" + "Target Class: " class-name "\n")))) (#e.Error _) - (&.throw Unknown-Field (format class-name "#" field-name))))) + (lang.throw Unknown-Field (format class-name "#" field-name))))) (def: (static-field class-name field-name) (-> Text Text (Meta [Type Bool])) @@ -758,7 +764,7 @@ (do @ [fieldT (java-type-to-lux-type fresh-mappings fieldJT)] (wrap [fieldT (Modifier::isFinal [modifiers])]))) - (&.throw Not-Static-Field (format class-name "#" field-name))))) + (lang.throw Not-Static-Field (format class-name "#" field-name))))) (def: (virtual-field class-name field-name objectT) (-> Text Text Type (Meta [Type Bool])) @@ -778,20 +784,20 @@ (do @ [#let [num-params (list.size _class-params) num-vars (list.size var-names)] - _ (&.assert Type-Parameter-Mismatch - (format "Expected: " (%i (nat-to-int num-params)) "\n" - " Actual: " (%i (nat-to-int num-vars)) "\n" - " Class: " _class-name "\n" - " Type: " (%type objectT)) - (n/= num-params num-vars))] + _ (lang.assert Type-Parameter-Mismatch + (format "Expected: " (%i (.int num-params)) "\n" + " Actual: " (%i (.int num-vars)) "\n" + " Class: " _class-name "\n" + " Type: " (%type objectT)) + (n/= num-params num-vars))] (wrap (|> (list.zip2 var-names _class-params) (dict.from-list text.Hash<Text>)))) _ - (&.throw Non-Object (%type objectT)))) + (lang.throw non-object objectT))) fieldT (java-type-to-lux-type mappings fieldJT)] (wrap [fieldT (Modifier::isFinal [modifiers])])) - (&.throw Not-Virtual-Field (format class-name "#" field-name))))) + (lang.throw Not-Virtual-Field (format class-name "#" field-name))))) (def: (static//get proc) (-> Text ///.Analysis) @@ -802,13 +808,13 @@ [[_ (#.Text class)] [_ (#.Text field)]] (do macro.Monad<Meta> [[fieldT final?] (static-field class field)] - (wrap (la.procedure proc (list (code.text class) (code.text field))))) + (wrap (#analysisL.Special proc (list (analysisL.text class) (analysisL.text field))))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))) + (lang.throw /.invalid-syntax [proc args])) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +2 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +2 (list.size args)])))) (def: (static//put proc) (-> Text ///.Analysis) @@ -818,19 +824,19 @@ (case [classC fieldC] [[_ (#.Text class)] [_ (#.Text field)]] (do macro.Monad<Meta> - [_ (&.infer Any) + [_ (typeA.infer Any) [fieldT final?] (static-field class field) - _ (&.assert Cannot-Set-Final-Field (format class "#" field) - (not final?)) - valueA (&.with-type fieldT + _ (lang.assert Cannot-Set-Final-Field (format class "#" field) + (not final?)) + valueA (typeA.with-type fieldT (analyse valueC))] - (wrap (la.procedure proc (list (code.text class) (code.text field) valueA)))) + (wrap (#analysisL.Special proc (list (analysisL.text class) (analysisL.text field) valueA)))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))) + (lang.throw /.invalid-syntax [proc args])) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +3 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +3 (list.size args)])))) (def: (virtual//get proc) (-> Text ///.Analysis) @@ -840,16 +846,16 @@ (case [classC fieldC] [[_ (#.Text class)] [_ (#.Text field)]] (do macro.Monad<Meta> - [[objectT objectA] (&common.with-unknown-type + [[objectT objectA] (typeA.with-inference (analyse objectC)) [fieldT final?] (virtual-field class field objectT)] - (wrap (la.procedure proc (list (code.text class) (code.text field) objectA)))) + (wrap (#analysisL.Special proc (list (analysisL.text class) (analysisL.text field) objectA)))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))) + (lang.throw /.invalid-syntax [proc args])) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +3 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +3 (list.size args)])))) (def: (virtual//put proc) (-> Text ///.Analysis) @@ -859,21 +865,21 @@ (case [classC fieldC] [[_ (#.Text class)] [_ (#.Text field)]] (do macro.Monad<Meta> - [[objectT objectA] (&common.with-unknown-type + [[objectT objectA] (typeA.with-inference (analyse objectC)) - _ (&.infer objectT) + _ (typeA.infer objectT) [fieldT final?] (virtual-field class field objectT) - _ (&.assert Cannot-Set-Final-Field (format class "#" field) - (not final?)) - valueA (&.with-type fieldT + _ (lang.assert Cannot-Set-Final-Field (format class "#" field) + (not final?)) + valueA (typeA.with-type fieldT (analyse valueC))] - (wrap (la.procedure proc (list (code.text class) (code.text field) valueA objectA)))) + (wrap (#analysisL.Special proc (list (analysisL.text class) (analysisL.text field) valueA objectA)))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))) + (lang.throw /.invalid-syntax [proc args])) _ - (&.throw @.Incorrect-Procedure-Arity (@.wrong-arity proc +4 (list.size args)))))) + (lang.throw /.incorrect-special-arity [proc +4 (list.size args)])))) (def: (java-type-to-parameter type) (-> java/lang/reflect/Type (Meta Text)) @@ -893,7 +899,7 @@ (wrap (format componentP "[]"))) ## else - (&.throw Cannot-Convert-To-Parameter (type-descriptor type)))) + (lang.throw Cannot-Convert-To-Parameter (jvm-type-name type)))) (type: Method-Type #Static @@ -947,13 +953,13 @@ (def: idx-to-bound (-> Nat Type) - (|>> (n/* +2) n/inc #.Bound)) + (|>> (n/* +2) inc #.Bound)) (def: (type-vars amount offset) (-> Nat Nat (List Type)) (if (n/= +0 amount) (list) - (|> (list.n/range offset (|> amount n/dec (n/+ offset))) + (|> (list.n/range offset (|> amount dec (n/+ offset))) (list/map idx-to-bound)))) (def: (method-to-type method-type method) @@ -1016,13 +1022,13 @@ (wrap [passes? method])))))] (case (list.filter product.left candidates) #.Nil - (&.throw No-Candidates (format class-name "#" method-name)) + (lang.throw No-Candidates (format class-name "#" method-name)) (#.Cons candidate #.Nil) (|> candidate product.right (method-to-type method-type)) _ - (&.throw Too-Many-Candidates (format class-name "#" method-name))))) + (lang.throw Too-Many-Candidates (format class-name "#" method-name))))) (def: (constructor-to-type constructor) (-> (Constructor Object) (Meta [Type (List Type)])) @@ -1072,20 +1078,20 @@ (wrap [passes? constructor])))))] (case (list.filter product.left candidates) #.Nil - (&.throw No-Candidates (format class-name "(" (text.join-with ", " arg-classes) ")")) + (lang.throw No-Candidates (format class-name "(" (text.join-with ", " arg-classes) ")")) (#.Cons candidate #.Nil) (|> candidate product.right constructor-to-type) _ - (&.throw Too-Many-Candidates class-name)))) + (lang.throw Too-Many-Candidates class-name)))) (def: (decorate-inputs typesT inputsA) - (-> (List Text) (List la.Analysis) (List la.Analysis)) + (-> (List Text) (List Analysis) (List Analysis)) (|> inputsA - (list.zip2 (list/map code.text typesT)) + (list.zip2 (list/map analysisL.text typesT)) (list/map (function (_ [type value]) - (la.product (list type value)))))) + (analysisL.product-analysis (list type value)))))) (def: (invoke//static proc) (-> Text ///.Analysis) @@ -1098,11 +1104,11 @@ [methodT exceptionsT] (methods class method #Static argsT) [outputT argsA] (inferenceA.general analyse methodT (list/map product.right argsTC)) outputJC (check-jvm outputT)] - (wrap (la.procedure proc (list& (code.text class) (code.text method) - (code.text outputJC) (decorate-inputs argsT argsA))))) + (wrap (#analysisL.Special proc (list& (analysisL.text class) (analysisL.text method) + (analysisL.text outputJC) (decorate-inputs argsT argsA))))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))))) + (lang.throw /.invalid-syntax [proc args])))) (def: (invoke//virtual proc) (-> Text ///.Analysis) @@ -1121,11 +1127,11 @@ _ (undefined))] outputJC (check-jvm outputT)] - (wrap (la.procedure proc (list& (code.text class) (code.text method) - (code.text outputJC) objectA (decorate-inputs argsT argsA))))) + (wrap (#analysisL.Special proc (list& (analysisL.text class) (analysisL.text method) + (analysisL.text outputJC) objectA (decorate-inputs argsT argsA))))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))))) + (lang.throw /.invalid-syntax [proc args])))) (def: (invoke//special proc) (-> Text ///.Analysis) @@ -1138,11 +1144,11 @@ [methodT exceptionsT] (methods class method #Special argsT) [outputT argsA] (inferenceA.general analyse methodT (list& objectC (list/map product.right argsTC))) outputJC (check-jvm outputT)] - (wrap (la.procedure proc (list& (code.text class) (code.text method) - (code.text outputJC) (decorate-inputs argsT argsA))))) + (wrap (#analysisL.Special proc (list& (analysisL.text class) (analysisL.text method) + (analysisL.text outputJC) (decorate-inputs argsT argsA))))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))))) + (lang.throw /.invalid-syntax [proc args])))) (def: (invoke//interface proc) (-> Text ///.Analysis) @@ -1153,17 +1159,17 @@ (do macro.Monad<Meta> [#let [argsT (list/map product.left argsTC)] class (load-class class-name) - _ (&.assert Non-Interface class-name - (Modifier::isInterface [(Class::getModifiers [] class)])) + _ (lang.assert non-interface class-name + (Modifier::isInterface [(Class::getModifiers [] class)])) [methodT exceptionsT] (methods class-name method #Interface argsT) [outputT argsA] (inferenceA.general analyse methodT (list& objectC (list/map product.right argsTC))) outputJC (check-jvm outputT)] - (wrap (la.procedure proc - (list& (code.text class-name) (code.text method) (code.text outputJC) - (decorate-inputs argsT argsA))))) + (wrap (#analysisL.Special proc + (list& (analysisL.text class-name) (analysisL.text method) (analysisL.text outputJC) + (decorate-inputs argsT argsA))))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))))) + (lang.throw /.invalid-syntax [proc args])))) (def: (invoke//constructor proc) (-> Text ///.Analysis) @@ -1175,36 +1181,36 @@ [#let [argsT (list/map product.left argsTC)] [methodT exceptionsT] (constructor-methods class argsT) [outputT argsA] (inferenceA.general analyse methodT (list/map product.right argsTC))] - (wrap (la.procedure proc (list& (code.text class) (decorate-inputs argsT argsA))))) + (wrap (#analysisL.Special proc (list& (analysisL.text class) (decorate-inputs argsT argsA))))) _ - (&.throw Wrong-Syntax (wrong-syntax proc args))))) + (lang.throw /.invalid-syntax [proc args])))) (def: member-procs - @.Bundle - (<| (@.prefix "member") + /.Bundle + (<| (/.prefix "member") (|> (dict.new text.Hash<Text>) - (dict.merge (<| (@.prefix "static") + (dict.merge (<| (/.prefix "static") (|> (dict.new text.Hash<Text>) - (@.install "get" static//get) - (@.install "put" static//put)))) - (dict.merge (<| (@.prefix "virtual") + (/.install "get" static//get) + (/.install "put" static//put)))) + (dict.merge (<| (/.prefix "virtual") (|> (dict.new text.Hash<Text>) - (@.install "get" virtual//get) - (@.install "put" virtual//put)))) - (dict.merge (<| (@.prefix "invoke") + (/.install "get" virtual//get) + (/.install "put" virtual//put)))) + (dict.merge (<| (/.prefix "invoke") (|> (dict.new text.Hash<Text>) - (@.install "static" invoke//static) - (@.install "virtual" invoke//virtual) - (@.install "special" invoke//special) - (@.install "interface" invoke//interface) - (@.install "constructor" invoke//constructor) + (/.install "static" invoke//static) + (/.install "virtual" invoke//virtual) + (/.install "special" invoke//special) + (/.install "interface" invoke//interface) + (/.install "constructor" invoke//constructor) ))) ))) -(def: #export procedures - @.Bundle - (<| (@.prefix "jvm") +(def: #export specials + /.Bundle + (<| (/.prefix "jvm") (|> (dict.new text.Hash<Text>) (dict.merge conversion-procs) (dict.merge int-procs) |