From 59f6d9b888bb0b224754e4bce3a5c01314002202 Mon Sep 17 00:00:00 2001 From: dakkar Date: Fri, 28 Jul 2023 11:34:57 +0100 Subject: STILL BORKEN we need attribute defaults, probably via functions? it currently explodes when it can't find a value for `class_attributes` for metaclasses of non-bootstrap classes --- bos-meta-attribute.sh | 4 +- bos-meta-bootstrap.sh | 106 +++++++++++++++++++++++++++++++------------------- bos-meta-class.sh | 14 ++++--- 3 files changed, 78 insertions(+), 46 deletions(-) diff --git a/bos-meta-attribute.sh b/bos-meta-attribute.sh index 0d65dce..403414d 100644 --- a/bos-meta-attribute.sh +++ b/bos-meta-attribute.sh @@ -74,7 +74,7 @@ function bos/meta/attribute/set-value() { assoc) eval "bos_meta_attribute_store=( ${@@Q} )" ;; esac - >&2 declare -p "$bos_meta_attribute_store_name" + >&2 echo -n 'set-value()'; >&2 declare -p "$bos_meta_attribute_store_name" return 0 } @@ -94,7 +94,7 @@ function bos/meta/attribute/get-value-into() { local attribute_type="$bos_meta_attribute_get_type" local associated_class="$bos_meta_attribute_get_class" - >&2 echo "getting ($self) ($attribute_name) ($attribute_type) ($associated_class)" + >&2 echo "getting ($self) ($attribute_name) ($attribute_type) ($associated_class) ($1)" local bos_meta_attribute_store_name; $self store-for-into bos_meta_attribute_store_name "$1" local -n bos_meta_attribute_store="$bos_meta_attribute_store_name" diff --git a/bos-meta-bootstrap.sh b/bos-meta-bootstrap.sh index b476f38..4199feb 100644 --- a/bos-meta-bootstrap.sh +++ b/bos-meta-bootstrap.sh @@ -16,133 +16,161 @@ bos-meta/set-metaclass-instance-for bos/meta/attribute "$bos_meta_attribute_meta $bos_meta_attribute_meta_class_instance make-mro-for bos/meta/attribute +# metaclass instance for bos/base + +declare bos_base_meta_class_instance +bos/meta/class/create-object-into bos_base_meta_class_instance bos/meta/class +bos-meta/set-metaclass-instance-for bos/base "$bos_base_meta_class_instance" + +$bos_base_meta_class_instance make-mro-for bos/base + # here we create meta-attributes for the three attributes of # bos/meta/attribute: attribute_name attribute_type associated_class # and register them with the $bos_meta_attribute_meta_class_instance -## we'll re-use this name -declare bos_meta_attribute_instance - ## this is the `attribute_name` meta-attribute -bos/meta/class/create-object-into bos_meta_attribute_instance bos/meta/attribute +bos/meta/class/create-object-into bos_meta_attribute_name_instance bos/meta/attribute attribute_type='scalar' associated_class='bos/meta/attribute' attribute_name='attribute_name' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" attribute_name +$bos_meta_attribute_name_instance set-value "$bos_meta_attribute_name_instance" attribute_name attribute_name='attribute_type' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" scalar +$bos_meta_attribute_name_instance set-value "$bos_meta_attribute_name_instance" scalar attribute_name='associated_class' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" bos/meta/attribute +$bos_meta_attribute_name_instance set-value "$bos_meta_attribute_name_instance" bos/meta/attribute -$bos_meta_attribute_meta_class_instance set-attribute-by-name 'attribute_name' "$bos_meta_attribute_instance" +unset attribute_type attribute_name associated_class + +$bos_meta_attribute_meta_class_instance set-attribute-by-name 'attribute_name' "$bos_meta_attribute_name_instance" ## this is the `attribute_type` meta-attribute -bos/meta/class/create-object-into bos_meta_attribute_instance bos/meta/attribute +bos/meta/class/create-object-into bos_meta_attribute_type_instance bos/meta/attribute attribute_type='scalar' associated_class='bos/meta/attribute' attribute_name='attribute_name' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" attribute_type +$bos_meta_attribute_type_instance set-value "$bos_meta_attribute_type_instance" attribute_type attribute_name='attribute_type' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" scalar +$bos_meta_attribute_type_instance set-value "$bos_meta_attribute_type_instance" scalar attribute_name='associated_class' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" bos/meta/attribute +$bos_meta_attribute_type_instance set-value "$bos_meta_attribute_type_instance" bos/meta/attribute + +unset attribute_type attribute_name associated_class -$bos_meta_attribute_meta_class_instance set-attribute-by-name 'attribute_type' "$bos_meta_attribute_instance" +$bos_meta_attribute_meta_class_instance set-attribute-by-name 'attribute_type' "$bos_meta_attribute_type_instance" ## this is the `associated_class` meta-attribute -bos/meta/class/create-object-into bos_meta_attribute_instance bos/meta/attribute +bos/meta/class/create-object-into bos_meta_attribute_class_instance bos/meta/attribute attribute_type='scalar' associated_class='bos/meta/attribute' attribute_name='attribute_name' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" associated_class +$bos_meta_attribute_class_instance set-value "$bos_meta_attribute_class_instance" associated_class attribute_name='attribute_type' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" scalar +$bos_meta_attribute_class_instance set-value "$bos_meta_attribute_class_instance" scalar attribute_name='associated_class' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" bos/meta/attribute +$bos_meta_attribute_class_instance set-value "$bos_meta_attribute_class_instance" bos/meta/attribute + +unset attribute_type attribute_name associated_class -$bos_meta_attribute_meta_class_instance set-attribute-by-name 'associated_class' "$bos_meta_attribute_instance" +$bos_meta_attribute_meta_class_instance set-attribute-by-name 'associated_class' "$bos_meta_attribute_class_instance" # now we set the attributes for bos/meta/class! ## this is the `class_attributes` meta-attribute -bos/meta/class/create-object-into bos_meta_attribute_instance bos/meta/attribute +bos/meta/class/create-object-into bos_meta_attribute_classattrs_instance bos/meta/attribute attribute_type='scalar' associated_class='bos/meta/attribute' attribute_name='attribute_name' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" 'class_attributes' +$bos_meta_attribute_classattrs_instance set-value "$bos_meta_attribute_classattrs_instance" 'class_attributes' attribute_name='attribute_type' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" assoc +$bos_meta_attribute_classattrs_instance set-value "$bos_meta_attribute_classattrs_instance" assoc attribute_name='associated_class' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" bos/meta/class +$bos_meta_attribute_classattrs_instance set-value "$bos_meta_attribute_classattrs_instance" bos/meta/class -$bos_meta_class_meta_class_instance set-attribute-by-name 'class_attributes' "$bos_meta_attribute_instance" +unset attribute_type attribute_name associated_class + +$bos_meta_class_meta_class_instance set-attribute-by-name 'class_attributes' "$bos_meta_attribute_classattrs_instance" +$bos_base_meta_class_instance set-attribute-by-name 'class_attributes' "$bos_meta_attribute_classattrs_instance" ## this is the `class_name` meta-attribute -bos/meta/class/create-object-into bos_meta_attribute_instance bos/meta/attribute +bos/meta/class/create-object-into bos_meta_attribute_classname_instance bos/meta/attribute attribute_type='scalar' associated_class='bos/meta/attribute' attribute_name='attribute_name' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" 'class_name' +$bos_meta_attribute_classname_instance set-value "$bos_meta_attribute_classname_instance" 'class_name' attribute_name='attribute_type' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" scalar +$bos_meta_attribute_classname_instance set-value "$bos_meta_attribute_classname_instance" scalar attribute_name='associated_class' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" bos/meta/class +$bos_meta_attribute_classname_instance set-value "$bos_meta_attribute_classname_instance" bos/meta/class + +unset attribute_type attribute_name associated_class -$bos_meta_class_meta_class_instance set-attribute-by-name 'class_name' "$bos_meta_attribute_instance" +$bos_meta_class_meta_class_instance set-attribute-by-name 'class_name' "$bos_meta_attribute_classname_instance" + +$bos_meta_attribute_classname_instance set-value "$bos_meta_class_meta_class_instance" 'bos/meta/class' +$bos_meta_attribute_classname_instance set-value "$bos_meta_attribute_meta_class_instance" 'bos/meta/attribute' +$bos_meta_attribute_classname_instance set-value "$bos_base_meta_class_instance" 'bos/base' ## this is the `isa` meta-attribute -bos/meta/class/create-object-into bos_meta_attribute_instance bos/meta/attribute +bos/meta/class/create-object-into bos_meta_attribute_isa_instance bos/meta/attribute attribute_type='scalar' associated_class='bos/meta/attribute' attribute_name='attribute_name' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" 'isa' +$bos_meta_attribute_isa_instance set-value "$bos_meta_attribute_isa_instance" 'isa' attribute_name='attribute_type' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" array +$bos_meta_attribute_isa_instance set-value "$bos_meta_attribute_isa_instance" array attribute_name='associated_class' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" bos/meta/class +$bos_meta_attribute_isa_instance set-value "$bos_meta_attribute_isa_instance" bos/meta/class + +unset attribute_type attribute_name associated_class -$bos_meta_class_meta_class_instance set-attribute-by-name 'isa' "$bos_meta_attribute_instance" +$bos_meta_class_meta_class_instance set-attribute-by-name 'isa' "$bos_meta_attribute_isa_instance" ## this is the `mro` meta-attribute -bos/meta/class/create-object-into bos_meta_attribute_instance bos/meta/attribute +bos/meta/class/create-object-into bos_meta_attribute_mro_instance bos/meta/attribute attribute_type='scalar' -associated_class='bos/meta/class' +associated_class='bos/meta/attribute' attribute_name='attribute_name' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" 'mro' +$bos_meta_attribute_mro_instance set-value "$bos_meta_attribute_mro_instance" 'mro' attribute_name='attribute_type' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" array +$bos_meta_attribute_mro_instance set-value "$bos_meta_attribute_mro_instance" array attribute_name='associated_class' -$bos_meta_attribute_instance set-value "$bos_meta_attribute_instance" bos/meta/class +$bos_meta_attribute_mro_instance set-value "$bos_meta_attribute_mro_instance" bos/meta/class + +unset attribute_type attribute_name associated_class + +$bos_meta_class_meta_class_instance set-attribute-by-name 'mro' "$bos_meta_attribute_mro_instance" -$bos_meta_class_meta_class_instance set-attribute-by-name 'mro' "$bos_meta_attribute_instance" +$bos_meta_attribute_mro_instance set-value "$bos_meta_class_meta_class_instance" 'bos/meta/class' +$bos_meta_attribute_mro_instance set-value "$bos_meta_attribute_meta_class_instance" 'bos/meta/attribute' +$bos_meta_attribute_mro_instance set-value "$bos_base_meta_class_instance" 'bos/base' unset bos_meta_class_meta_class_instance bos_meta_attribute_instance attribute_name attribute_type associated_class diff --git a/bos-meta-class.sh b/bos-meta-class.sh index 9e25b90..bd83c29 100644 --- a/bos-meta-class.sh +++ b/bos-meta-class.sh @@ -154,7 +154,7 @@ function bos/meta/class/find-attribute-into() { # minimal MRO: the class itself if [[ "${#mro[@]}" -eq 0 ]]; then - mro=( "$class" ) + mro=( "$bos_meta_class_find_attribute_class" ) fi local bos_meta_class_for_class @@ -163,6 +163,8 @@ function bos/meta/class/find-attribute-into() { for bos_class_from_mro in "${mro[@]}"; do bos-meta/metaclass-instance-for-class-into bos_meta_class_for_class "$bos_class_from_mro" + >&2 echo "from mro(${mro[*]})=$bos_class_from_mro meta=$bos_meta_class_for_class" + $bos_meta_class_for_class get-attribute-by-name-into bos_meta_class_find_attribute_result "$bos_meta_class_find_attribute_attribute_name" if [[ -n "$bos_meta_class_find_attribute_result" ]]; then @@ -171,7 +173,7 @@ function bos/meta/class/find-attribute-into() { done # TODO: better error / failure - >&2 echo "attribute $attribute_name not found via class $class" + >&2 echo "attribute $bos_meta_class_find_attribute_attribute_name not found via class $bos_meta_class_find_attribute_class" return 1 } @@ -200,9 +202,11 @@ function bos/meta/class/invoke() { local ffsname="to_invoke_${#FUNCNAME[*]}" $self find-method-into "$ffsname" "$bos_invoke_class" "$bos_invoke_start_from_class" "$bos_invoke_method" + local bos_invoke_target_class="${!ffsname%/*}" local bos_invoke_attrs_attr - $self find-attribute-into bos_invoke_attrs_attr "$bos_invoke_class" 'class_attributes' - + $self find-attribute-into bos_invoke_attrs_attr "$bos_invoke_target_class" 'class_attributes' + >&2 echo "for (${bos_invoke_class}->${bos_invoke_target_class}) class_attributes = $bos_invoke_attrs_attr" + if [[ -n "$bos_invoke_attrs_attr" ]]; then local -A bos_invoke_attrs $bos_invoke_attrs_attr get-value-into bos_invoke_attrs "$self" @@ -220,7 +224,7 @@ function bos/meta/class/invoke() { assoc) local -A "$bos_invoke_attr_name" ;; esac - $bos_invoke_attr_obj get-value-into "$bos_invoke_attr_name" + $bos_invoke_attr_obj get-value-into "$bos_invoke_attr_name" "$self" done fi -- cgit v1.2.3