summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2023-07-28 11:34:57 +0100
committerdakkar <dakkar@thenautilus.net>2023-07-28 11:34:57 +0100
commit59f6d9b888bb0b224754e4bce3a5c01314002202 (patch)
treed2f5f3daab8800e27980f4a1a8c4cf647081811a
parentBROKEN (diff)
downloadbash-object-system-59f6d9b888bb0b224754e4bce3a5c01314002202.tar.gz
bash-object-system-59f6d9b888bb0b224754e4bce3a5c01314002202.tar.bz2
bash-object-system-59f6d9b888bb0b224754e4bce3a5c01314002202.zip
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
-rw-r--r--bos-meta-attribute.sh4
-rw-r--r--bos-meta-bootstrap.sh106
-rw-r--r--bos-meta-class.sh14
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