summaryrefslogtreecommitdiff
path: root/bos-sugar.sh
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2023-07-22 14:07:56 +0100
committerdakkar <dakkar@thenautilus.net>2023-07-22 14:07:56 +0100
commit709cf92de411b7a57c7298f8d970901930c4ce0f (patch)
tree1c88dd977cc60698c8fc22d7eab0c80a2b294764 /bos-sugar.sh
parent`*-into` always takes the destination as `$1` (diff)
downloadbash-object-system-709cf92de411b7a57c7298f8d970901930c4ce0f.tar.gz
bash-object-system-709cf92de411b7a57c7298f8d970901930c4ce0f.tar.bz2
bash-object-system-709cf92de411b7a57c7298f8d970901930c4ce0f.zip
fix block&namespace nesting
Diffstat (limited to 'bos-sugar.sh')
-rw-r--r--bos-sugar.sh91
1 files changed, 62 insertions, 29 deletions
diff --git a/bos-sugar.sh b/bos-sugar.sh
index 2da789a..1322b36 100644
--- a/bos-sugar.sh
+++ b/bos-sugar.sh
@@ -1,47 +1,58 @@
#!bash
-declare -a bos_sugar_block_toggle
+declare -a bos_sugar_block_stack
-function bos-sugar/block() {
+function bos-sugar/push() {
+ bos_sugar_block_stack+=( 0 )
+}
+
+function bos-sugar/block-and-pop() {
local on_open="$1"; shift
local on_close="$1"; shift
- local depth="${#FUNCNAME[*]}"
- if [[ -z "${bos_sugar_block_toggle[$depth]}" ]]; then
- bos_sugar_block_toggle=( ["$depth"]=1 )
- "$on_open" "$@"
+
+ if [[ "${bos_sugar_block_stack[-1]}" == 0 ]]; then
+ bos_sugar_block_stack[-1]=1
+ "$on_open" "$@" && return 0
else
- unset "bos_sugar_block_toggle[$depth]"
- "$on_close" "$@"
+ unset "bos_sugar_block_toggle[-1]"
+ "$on_close" "$@" && return 1
fi
}
-declare -a bos_sugar_class_stack
+function bos-sugar/declare-block() {
+ local block_name="$1"
+ local open_func="$2"
+ local close_func="$3"
-function bos-sugar/current-class-into() {
- local -n bos_sugar_current_class_result="$1"
- local IFS=/
- bos_sugar_current_class_result="${bos_sugar_class_stack[*]}"
+ shopt -s expand_aliases
+
+ eval "alias $1='bos-sugar/push; while bos-sugar/block-and-pop $open_func $close_func'"
}
-function bos-sugar/set-metaclass-for-current-class() {
- local class; bos-sugar/current-class-into class
+# ----
+
+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/mop/inheritance 0'
}
function bos-sugar/class-open() {
- if [[ "${#*}" -gt 1 ]]; then
+ if [[ "${#*}" -ne 1 ]]; then
>&2 echo "'class \$class_name; do …; done', not 'class $*'"
return 1
fi
+
local class="$1"
- bos_sugar_class_stack+=( "$class" )
- bos-sugar/set-metaclass-for-current-class
- local fq_class; bos-sugar/current-class-into fq_class
+ bos-namespaces/push "$class"
+
+ local fq_class; bos-namespaces/current-namespace-into fq_class
+
+ bos-sugar/set-metaclass-for "$fq_class"
function extends() {
- local fq_class; bos-sugar/current-class-into fq_class
+ 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" "$@"
@@ -49,7 +60,7 @@ function bos-sugar/class-open() {
eval "function $fq_class { bos-dispatch/invoke \"$fq_class\" 0 \"\$@\"; }"
- bos-namespaces/start "$fq_class"
+ bos-namespaces/save-funcs
# this will get renamed into the class
function new-into() {
@@ -68,22 +79,44 @@ function bos-sugar/class-open() {
}
function bos-sugar/class-close() {
- local class="$1"
+ local class="$1";
- local fq_class; bos-sugar/current-class-into fq_class
+ 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"
- local -a methods_list; bos-namespaces/list-new-funcs-into methods_list "$fq_class"
- bos-namespaces/qualify-funcs "$fq_class" "${methods_list[@]}"
+ local -a methods_list; bos-namespaces/list-new-funcs-into methods_list
+ bos-namespaces/qualify-funcs "${methods_list[@]}"
$metaclass_object make-mro-for "$fq_class"
- unset "bos_sugar_class_stack[-1]"
+ bos-namespaces/pop
+
+ return 0
+}
+
+bos-sugar/declare-block class bos-sugar/class-open bos-sugar/class-close
+
+function bos-sugar/namespace-open() {
+ if [[ "${#*}" -ne 1 ]]; then
+ >&2 echo "'namespace \$namespace_name; do …; done', not 'namespace $*'"
+ return 1
+ fi
+
+ bos-namespaces/push "$1"
+ bos-namespaces/save-funcs
- return 1
+ return 0
+}
+
+function bos-sugar/namespace-close() {
+ local -a methods_list; bos-namespaces/list-new-funcs-into methods_list
+ bos-namespaces/qualify-funcs "${methods_list[@]}"
+
+ bos-namespaces/pop
+
+ return 0
}
-shopt -s expand_aliases
+bos-sugar/declare-block namespace bos-sugar/namespace-open bos-sugar/namespace-close
-alias class='while bos-sugar/block bos-sugar/class-open bos-sugar/class-close'