From 02eec4498027352e87826929d015f5b47bad93f8 Mon Sep 17 00:00:00 2001 From: dakkar Date: Sat, 22 Jul 2023 16:38:33 +0100 Subject: metaclass instances --- bos-sugar.sh | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) (limited to 'bos-sugar.sh') diff --git a/bos-sugar.sh b/bos-sugar.sh index 8f3a810..152f5d8 100644 --- a/bos-sugar.sh +++ b/bos-sugar.sh @@ -31,31 +31,34 @@ function bos-sugar/declare-block() { # ---- -function bos-sugar/set-metaclass-for() { - local class="$1" - local metaclass_ref; bos-namespaces/store-scalar-for-into metaclass_ref meta "$class" - local -n metaclass_object="$metaclass_ref" - metaclass_object='bos-dispatch/invoke bos/meta/class 0' +function bos-sugar/declare-helpers() { + function extends() { + local fq_class; bos-namespaces/current-namespace-into fq_class + local metaclass_instance; bos-meta/metaclass-instance-for-class-into metaclass_instance "$fq_class" + $metaclass_instance set-superclasses-for "$fq_class" "$@" + } +} + +function bos-sugar/remove-helpers() { + unset extends } function bos-sugar/class-open() { - if [[ "${#*}" -ne 1 ]]; then - >&2 echo "'class \$class_name; do …; done', not 'class $*'" + if [[ "${#*}" -lt 1 || "${#*}" -gt 2 ]]; then + >&2 echo "'class \$class_name [\$metaclass]; do …; done', not 'class $*'" return 1 fi + local class="$1" + local metaclass="${2:-bos/meta/class}" - function extends() { - local fq_class; bos-namespaces/current-namespace-into fq_class - local metaclass_ref; bos-namespaces/store-scalar-for-into metaclass_ref meta "$fq_class" - local -n metaclass_object="$metaclass_ref" - $metaclass_object set-superclasses-for "$fq_class" "$@" - } + bos-sugar/declare-helpers - local class="$1" bos-namespaces/namespace-open "$1" local fq_class; bos-namespaces/current-namespace-into fq_class - bos-sugar/set-metaclass-for "$fq_class" + local class_open_metaclass_instance; $metaclass new-into class_open_metaclass_instance + + bos-meta/set-metaclass-instance-for "$fq_class" "$class_open_metaclass_instance" return 0 } @@ -64,16 +67,18 @@ function bos-sugar/class-close() { local class="$1"; local fq_class; bos-namespaces/current-namespace-into fq_class - local metaclass_ref; bos-namespaces/store-scalar-for-into metaclass_ref meta "$fq_class" - local -n metaclass_object="$metaclass_ref" bos-namespaces/namespace-close - $metaclass_object make-mro-for "$fq_class" + local class_close_metaclass_instance; bos-meta/metaclass-instance-for-class-into class_close_metaclass_instance "$fq_class" + + $class_close_metaclass_instance make-mro-for "$fq_class" # TODO this should probably be done by the metaclass? eval "function $fq_class { bos-dispatch/invoke \"$fq_class\" 0 \"\$@\"; }" + bos-sugar/remove-helpers + return 0 } -- cgit v1.2.3