aboutsummaryrefslogtreecommitdiff
path: root/lux-bootstrapper/src/lux/analyser/record.clj
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lux-bootstrapper/src/lux/analyser/record.clj39
1 files changed, 20 insertions, 19 deletions
diff --git a/lux-bootstrapper/src/lux/analyser/record.clj b/lux-bootstrapper/src/lux/analyser/record.clj
index 53f6c4d5c..7af3c17ac 100644
--- a/lux-bootstrapper/src/lux/analyser/record.clj
+++ b/lux-bootstrapper/src/lux/analyser/record.clj
@@ -10,18 +10,18 @@
(defn order-record
"(-> (List (, Syntax Syntax)) (Lux (List Syntax)))"
[pairs]
- (|do [[tag-group tag-type] (|case pairs
- (&/$End)
- (return (&/T [&/$End &type/Any]))
-
- (&/$Item [[_ (&/$Tag tag1)] _] _)
- (|do [[module name] (&&/resolved-ident tag1)
- tags (&&module/tag-group module name)
- type (&&module/tag-type module name)]
- (return (&/T [tags type])))
+ (|do [[module slot-group slot-type] (|case pairs
+ (&/$End)
+ (|do [module &/get-module-name]
+ (return (&/T [module &/$End &type/Any])))
+
+ (&/$Item [[_ (&/$Tag slot1)] _] _)
+ (|do [[module name] (&&/resolved-ident slot1)
+ [_exported? type slots _index] (&&module/find-slot module (str "#" name))]
+ (return (&/T [module slots type])))
- _
- (&/fail-with-loc "[Analyser Error] Wrong syntax for records. Odd elements must be tags."))
+ _
+ (&/fail-with-loc "[Analyser Error] Wrong syntax for records. Odd elements must be slots."))
=pairs (&/map% (fn [kv]
(|case kv
[[_ (&/$Tag k)] v]
@@ -29,15 +29,16 @@
(return (&/T [(&/ident->text =k) v])))
_
- (&/fail-with-loc "[Analyser Error] Wrong syntax for records. Odd elements must be tags.")))
+ (&/fail-with-loc "[Analyser Error] Wrong syntax for records. Odd elements must be slots.")))
pairs)
- _ (let [num-expected (&/|length tag-group)
+ _ (let [num-expected (&/|length slot-group)
num-got (&/|length =pairs)]
(&/assert! (= num-expected num-got)
(str "[Analyser Error] Wrong number of record members. Expected " num-expected ", but got " num-got ".")))
- =members (&/map% (fn [tag]
- (if-let [member (&/|get tag =pairs)]
- (return member)
- (&/fail-with-loc (str "[Analyser Error] Missing tag: " tag))))
- (&/|map &/ident->text tag-group))]
- (return (&/T [=members tag-type]))))
+ =members (&/map% (fn [slot]
+ (let [slot (&/ident->text (&/T [module slot]))]
+ (if-let [member (&/|get slot =pairs)]
+ (return member)
+ (&/fail-with-loc (str "[Analyser Error] Missing slot: " slot)))))
+ slot-group)]
+ (return (&/T [=members slot-type]))))