aboutsummaryrefslogtreecommitdiff
path: root/make
diff options
context:
space:
mode:
Diffstat (limited to 'make')
-rw-r--r--make/core.mk19
-rw-r--r--make/printer.mk6
-rwxr-xr-xmake/reader.mk16
-rw-r--r--make/step3_env.mk3
-rw-r--r--make/step4_if_fn_do.mk3
-rw-r--r--make/step6_file.mk3
-rw-r--r--make/step7_quote.mk3
-rw-r--r--make/step8_macros.mk3
-rw-r--r--make/step9_try.mk3
-rw-r--r--make/stepA_interop.mk3
-rw-r--r--make/types.mk18
-rw-r--r--make/util.mk1
12 files changed, 63 insertions, 18 deletions
diff --git a/make/core.mk b/make/core.mk
index dc55ed5..0bb17e6 100644
--- a/make/core.mk
+++ b/make/core.mk
@@ -32,8 +32,13 @@ false? = $(if $(call _false?,$(1)),$(__true),$(__false))
# Symbol functions
+symbol = $(call _symbol,$(call str_decode,$($(1)_value)))
symbol? = $(if $(call _symbol?,$(1)),$(__true),$(__false))
+# Keyword functions
+keyword = $(call _keyword,$(call str_decode,$($(1)_value)))
+keyword? = $(if $(call _keyword?,$(1)),$(__true),$(__false))
+
# Number functions
number? = $(if $(call _number?,$(1)),$(__true),$(__false))
@@ -98,10 +103,9 @@ assoc = $(word 1,\
dissoc = $(word 1,\
$(foreach hm,$(call _clone_obj,$(word 1,$(1))),\
$(hm) \
- $(foreach key,$(wordlist 2,$(words $(1)),$(1)),\
- $(call _dissoc!,$(hm),$(call str_decode,$($(key)_value))))))
+ $(call _dissoc_seq!,$(hm),$(wordlist 2,$(words $(1)),$(1)))))
-keys = $(foreach new_list,$(call _list),$(new_list)$(eval $(new_list)_value := $(foreach v,$(call __get_obj_values,$(1)),$(call _string,$(word 4,$(subst _, ,$(v)))))))
+keys = $(foreach new_list,$(call _list),$(new_list)$(eval $(new_list)_value := $(foreach v,$(call __get_obj_values,$(1)),$(foreach vval,$(word 4,$(subst _, ,$(v))),$(if $(filter $(__keyword)%,$(vval)),$(call _keyword,$(patsubst $(__keyword)%,%,$(vval))),$(call _string,$(vval)))))))
vals = $(foreach new_list,$(call _list),$(new_list)$(eval $(new_list)_value := $(foreach v,$(call __get_obj_values,$(1)),$($(v)))))
@@ -127,7 +131,10 @@ cons = $(word 1,$(foreach new_list,$(call _list),$(new_list) $(eval $(new_list)_
concat = $(word 1,$(foreach new_list,$(call _list),$(new_list) $(eval $(new_list)_value := $(strip $(foreach lst,$1,$(call __get_obj_values,$(lst)))))))
-nth = $(word $(call gmsl_plus,1,$(call int_decode,$($(word 2,$(1))_value))),$($(word 1,$(1))_value))
+nth = $(strip \
+ $(if $(call int_lt,$($(word 2,$(1))_value),$(call int_encode,$(call _count,$(word 1,$(1))))),\
+ $(word $(call gmsl_plus,1,$(call int_decode,$($(word 2,$(1))_value))),$($(word 1,$(1))_value)),\
+ $(call _error,nth: index out of range)))
sfirst = $(word 1,$($(1)_value))
@@ -209,8 +216,10 @@ core_ns = type obj_type \
nil? nil? \
true? true? \
false? false? \
- symbol _symbol \
+ symbol symbol \
symbol? symbol? \
+ keyword keyword \
+ keyword? keyword? \
function? function? \
string? string? \
\
diff --git a/make/printer.mk b/make/printer.mk
index a1f2559..10b9789 100644
--- a/make/printer.mk
+++ b/make/printer.mk
@@ -30,7 +30,9 @@ number_pr_str = $(call int_decode,$($(1)_value))
symbol_pr_str = $($(1)_value)
-string_pr_str = $(if $(2),"$(subst $(DQUOTE),$(ESC_DQUOTE),$(subst $(SLASH),$(SLASH)$(SLASH),$(call str_decode,$($(1)_value))))",$(call str_decode,$($(1)_value)))
+keyword_pr_str = $(COLON)$(patsubst $(__keyword)%,%,$(call str_decode,$($(1)_value)))
+
+string_pr_str = $(if $(filter $(__keyword)%,$(call str_decode,$($(1)_value))),$(COLON)$(patsubst $(__keyword)%,%,$(call str_decode,$($(1)_value))),$(if $(2),"$(subst $(DQUOTE),$(ESC_DQUOTE),$(subst $(SLASH),$(SLASH)$(SLASH),$(call str_decode,$($(1)_value))))",$(call str_decode,$($(1)_value))))
function_pr_str = <$(if $(word 6,$(value $(1)_value)),$(wordlist 1,5,$(value $(1)_value))...,$(value $(1)_value))>
@@ -38,7 +40,7 @@ list_pr_str = ($(foreach v,$(call __get_obj_values,$(1)),$(call _pr_str,$(v),$(2
vector_pr_str = [$(foreach v,$(call __get_obj_values,$(1)),$(call _pr_str,$(v),$(2)))]
-hash_map_pr_str = {$(foreach v,$(call __get_obj_values,$(1)),"$(foreach hcode,$(word 3,$(subst _, ,$(1))),$(patsubst $(1)_%,%,$(v:%_value=%)))" $(call _pr_str,$($(v)),$(2)))}
+hash_map_pr_str = {$(foreach v,$(call __get_obj_values,$(1)),$(foreach vval,$(foreach hcode,$(word 3,$(subst _, ,$(1))),$(patsubst $(1)_%,%,$(v:%_value=%))),$(if $(filter $(__keyword)%,$(vval)),$(patsubst $(__keyword)%,$(COLON)%,$(vval)),"$(vval)")) $(call _pr_str,$($(v)),$(2)))}
atom_pr_str = (atom $(call _pr_str,$($(1)_value),$(2)))
diff --git a/make/reader.mk b/make/reader.mk
index 8d04596..8571785 100755
--- a/make/reader.mk
+++ b/make/reader.mk
@@ -52,6 +52,17 @@ $(foreach ch,$(word 1,$($(1))),\
))
endef
+define READ_KEYWORD
+$(foreach ch,$(word 1,$($(1))),\
+ $(if $(ch),\
+ $(if $(filter $(_TOKEN_DELIMS),$(ch)),\
+ ,\
+ $(eval $(1) := $(wordlist 2,$(words $($(1))),$($(1))))\
+ $(and $(READER_DEBUG),$(info READ_KEYWORD ch: $(ch) | $($(1))))\
+ $(ch)$(strip $(call READ_KEYWORD,$(1)))),\
+ ))
+endef
+
define READ_ATOM
$(foreach ch,$(word 1,$($(1))),\
$(if $(filter $(NUMBERS),$(ch)),\
@@ -62,6 +73,9 @@ $(foreach ch,$(word 1,$($(1))),\
$(eval $(if $(filter $(DQUOTE),$(word 1,$($(1)))),\
$(eval $(1) := $(wordlist 2,$(words $($(1))),$($(1)))),\
$(call _error,Expected '$(DQUOTE)' in; $($(1))))),\
+ $(if $(filter $(COLON),$(ch)),\
+ $(eval $(1) := $(wordlist 2,$(words $($(1))),$($(1))))\
+ $(call _keyword,$(call READ_KEYWORD,$(1))),\
$(foreach sym,$(call READ_SYMBOL,$(1)),\
$(if $(call _EQ,nil,$(sym)),\
$(__nil),\
@@ -69,7 +83,7 @@ $(foreach ch,$(word 1,$($(1))),\
$(__true),\
$(if $(call _EQ,false,$(sym)),\
$(__false),\
- $(call _symbol,$(sym)))))))))
+ $(call _symbol,$(sym))))))))))
endef
# read and return tokens until $(2) found
diff --git a/make/step3_env.mk b/make/step3_env.mk
index b548874..ddcb70f 100644
--- a/make/step3_env.mk
+++ b/make/step3_env.mk
@@ -57,7 +57,8 @@ $(if $(__ERROR),,\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
$(foreach res,$(call EVAL,$(a2),$(2)),\
- $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),)))),\
+ $(if $(__ERROR),,\
+ $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),))))),\
$(if $(call _EQ,let*,$($(a0)_value)),\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
diff --git a/make/step4_if_fn_do.mk b/make/step4_if_fn_do.mk
index 47f7fe4..22d1d21 100644
--- a/make/step4_if_fn_do.mk
+++ b/make/step4_if_fn_do.mk
@@ -57,7 +57,8 @@ $(if $(__ERROR),,\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
$(foreach res,$(call EVAL,$(a2),$(2)),\
- $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),)))),\
+ $(if $(__ERROR),,\
+ $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),))))),\
$(if $(call _EQ,let*,$($(a0)_value)),\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
diff --git a/make/step6_file.mk b/make/step6_file.mk
index f0298a9..b05f723 100644
--- a/make/step6_file.mk
+++ b/make/step6_file.mk
@@ -57,7 +57,8 @@ $(if $(__ERROR),,\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
$(foreach res,$(call EVAL,$(a2),$(2)),\
- $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),)))),\
+ $(if $(__ERROR),,\
+ $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),))))),\
$(if $(call _EQ,let*,$($(a0)_value)),\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
diff --git a/make/step7_quote.mk b/make/step7_quote.mk
index df3745f..2af0248 100644
--- a/make/step7_quote.mk
+++ b/make/step7_quote.mk
@@ -70,7 +70,8 @@ $(if $(__ERROR),,\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
$(foreach res,$(call EVAL,$(a2),$(2)),\
- $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),)))),\
+ $(if $(__ERROR),,\
+ $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),))))),\
$(if $(call _EQ,let*,$($(a0)_value)),\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
diff --git a/make/step8_macros.mk b/make/step8_macros.mk
index 96e5d31..172e64d 100644
--- a/make/step8_macros.mk
+++ b/make/step8_macros.mk
@@ -82,7 +82,8 @@ $(if $(__ERROR),,\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
$(foreach res,$(call EVAL,$(a2),$(2)),\
- $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),)))),\
+ $(if $(__ERROR),,\
+ $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),))))),\
$(if $(call _EQ,let*,$($(a0)_value)),\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
diff --git a/make/step9_try.mk b/make/step9_try.mk
index 4c5b8c1..1474302 100644
--- a/make/step9_try.mk
+++ b/make/step9_try.mk
@@ -82,7 +82,8 @@ $(if $(__ERROR),,\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
$(foreach res,$(call EVAL,$(a2),$(2)),\
- $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),)))),\
+ $(if $(__ERROR),,\
+ $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),))))),\
$(if $(call _EQ,let*,$($(a0)_value)),\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
diff --git a/make/stepA_interop.mk b/make/stepA_interop.mk
index 050366c..80909c7 100644
--- a/make/stepA_interop.mk
+++ b/make/stepA_interop.mk
@@ -82,7 +82,8 @@ $(if $(__ERROR),,\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
$(foreach res,$(call EVAL,$(a2),$(2)),\
- $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),)))),\
+ $(if $(__ERROR),,\
+ $(if $(call ENV_SET,$(2),$($(a1)_value),$(res)),$(res),))))),\
$(if $(call _EQ,let*,$($(a0)_value)),\
$(foreach a1,$(call _nth,$(1),1),\
$(foreach a2,$(call _nth,$(1),2),\
diff --git a/make/types.mk b/make/types.mk
index b971fb1..02588f7 100644
--- a/make/types.mk
+++ b/make/types.mk
@@ -15,6 +15,7 @@ include $(_TOP_DIR)util.mk
__obj_magic = ⍄⁊
# \u2256
__equal = ≛
+__keyword = ʞ
__obj_hash_code = 0
__new_obj_hash_code = $(eval __obj_hash_code := $(call gmsl_plus,1,$(__obj_hash_code)))$(__obj_hash_code)
@@ -50,6 +51,8 @@ __var_print = $(foreach v,$(1),\
$(call __var_print,$($(vkey)),$(2)$(SPACE)$(SPACE)$(SPACE)$(SPACE)))),\
$(if $(call _symbol?,$(v)),\
$(info $(2)$(var): $($(v)_value)),\
+ $(if $(call _keyword?,$(v)),\
+ $(info $(2)$(var): $($(v)_value)),\
$(if $(call _number?,$(v)),\
$(info $(2)$(var): $(call int_decode,$($(v)_value))),\
$(if $(call _nil?,$(v)),\
@@ -58,7 +61,7 @@ __var_print = $(foreach v,$(1),\
$(if $(word 6,$(value $(v)_value)),\
$(info $(2)$(var): $(wordlist 1,5,$(value $(v)_value))...),\
$(info $(2)$(var): $(value $(v)_value))),\
- $(info $(2)$(var): ...)))))))))
+ $(info $(2)$(var): ...))))))))))
_visualize_memory = $(foreach var,$(sort $(foreach vv,$(filter $(__obj_magic)_%,$(.VARIABLES)),$(call __var_name,$(vv)))),$(call __var_print,$(__obj_magic)_$(var)))
@@ -83,7 +86,8 @@ _obj_type = $(strip \
$(if $(filter $(__obj_magic)_list_%,$(1)),list,\
$(if $(filter $(__obj_magic)_numb_%,$(1)),number,\
$(if $(filter $(__obj_magic)_func_%,$(1)),function,\
- $(if $(filter $(__obj_magic)_strn_%,$(1)),string,\
+ $(if $(filter $(__obj_magic)_strn_%,$(1)),\
+ $(if $(filter $(__keyword)%,$($(1)_value)),keyword,string),\
$(if $(filter $(__obj_magic)__nil_%,$(1)),nil,\
$(if $(filter $(__obj_magic)_true_%,$(1)),true,\
$(if $(filter $(__obj_magic)_fals_%,$(1)),false,\
@@ -109,7 +113,7 @@ _equal? = $(strip \
$(foreach ot1,$(call _obj_type,$(1)),$(foreach ot2,$(call _obj_type,$(2)),\
$(if $(or $(call _EQ,$(ot1),$(ot2)),\
$(and $(call _sequential?,$(1)),$(call _sequential?,$(2)))),\
- $(if $(or $(call _string?,$(1)),$(call _symbol?,$(1)),$(call _number?,$(1))),\
+ $(if $(or $(call _string?,$(1)),$(call _symbol?,$(1)),$(call _keyword?,$(1)),$(call _number?,$(1))),\
$(call _EQ,$($(1)_value),$($(2)_value)),\
$(if $(or $(call _vector?,$(1)),$(call _list?,$(1)),$(call _hash_map?,$(1))),\
$(if $(and $(call _EQ,$(call _count,$(1)),$(call _count,$(2))),\
@@ -130,6 +134,11 @@ _symbol = $(foreach hcode,$(call __new_obj_hash_code),$(__obj_magic)_symb_$(hcod
_symbol? = $(if $(filter $(__obj_magic)_symb_%,$(1)),$(__true),)
+# Keywords
+_keyword = $(foreach hcode,$(call __new_obj_hash_code),$(__obj_magic)_strn_$(hcode)$(eval $(__obj_magic)_strn_$(hcode)_value := $(__keyword)$(1)))
+_keyword? = $(if $(filter $(__obj_magic)_strn_%,$(1)),$(if $(filter $(__keyword)%,$($(1)_value)),$(__true),))
+
+
# Numbers
_pnumber = $(foreach hcode,$(call __new_obj_hash_code),$(__obj_magic)_numb_$(hcode)$(eval $(__obj_magic)_numb_$(hcode)_value := $(1)))
_number = $(call _pnumber,$(call int_encode,$(1)))
@@ -176,6 +185,9 @@ _hash_map? = $(if $(filter $(__obj_magic)_hmap_%,$(1)),$(__true),)
# Set multiple key/values in a map
_assoc_seq! = $(call _assoc!,$(1),$(call str_decode,$($(word 1,$(2))_value)),$(word 2,$(2)))$(if $(word 3,$(2)),$(call _assoc_seq!,$(1),$(wordlist 3,$(words $(2)),$(2))),)
+_dissoc_seq! = $(foreach key,$(2),\
+ $(call _dissoc!,$(1),$(call str_decode,$($(key)_value))))
+
# set a key/value in the hash map
_assoc! = $(foreach k,$(subst =,$(__equal),$(2)),$(if $(call _undefined?,$(1)_$(k)_value),$(eval $(1)_size := $(call gmsl_plus,$($(1)_size),1)),)$(eval $(1)_$(k)_value := $(3))$(1))
diff --git a/make/util.mk b/make/util.mk
index 43923fc..eff258a 100644
--- a/make/util.mk
+++ b/make/util.mk
@@ -10,6 +10,7 @@ include $(_TOP_DIR)gmsl.mk
SEMI := ;
COMMA := ,
+COLON := :
LCURLY := {
RCURLY := }
LPAREN := (