mzscript List Bangs Thread last updated on 2004-07-19 13:35:16

Posted by member 37809 on 2004-07-18 23:24:40

Here are some bangs for mzscript lists (last tested under 0.9 beta 12) that try to make array-like operations easier. Funny that I don't find myself using them often.

By odd convention I use the word 'empty' to indicate 'nothing' and thus to terminate a list. From what I remember, older versions of mzscript had trouble in conditionals where one operand was the empty string (""), while ancient versions of mzscript could handle the empty string fine.
*script bang !listadd ;<listname> <element>
;; adds <element> to list <listname> only if not already in the list
*script exec !varset _listadd_a1 "%{\1}"
*script exec !varset _listadd_a2 "%{\2}"
*script gotoif ("%{_listadd_a2}" = "empty") clean
*script exec !varset _listadd_w "{%{_listadd_a1}}"
*script exec !varset _listadd_w "%%{_listadd_w}:empty"
*script exec !varset _listadd_k "X"
*script gotoif ("%{_listadd_w}" = ":empty") clean
*script gotoif ("%{_listadd_w:}" = "empty") new
*script label loop
*script gotoif ("%{_listadd_w}" = "empty") done
*script gotoif ("%{_listadd_w:}" = "%{_listadd_a2}") clean
*script exec !varset _listadd_k "%{_listadd_k}:%{_listadd_w:}"
*script exec !varset _listadd_w "%{_listadd_w:_}"
*script goto loop
*script label done
*script exec !varset %{_listadd_a1} "%{_listadd_k:_}:%{_listadd_a2}"
*script goto clean
*script label new
*script exec !varset %{_listadd_a1} %{_listadd_a2}
*script label clean
*script exec !varremove _listadd_a1
*script exec !varremove _listadd_a2
*script exec !varremove _listadd_w
*script exec !varremove _listadd_k
*script ~bang


;*script bang !_test_listadd
;*script exec !varset foo empty
;
;*script exec !listadd foo apple
;*script exec !varshow foo
;
;*script exec !listadd foo butter
;*script exec !varshow foo
;
;*script exec !listadd foo empty
;*script exec !varshow foo
;
;*script exec !listadd foo butter
;*script exec !varshow foo
;*script ~bang


*script bang !listget ;<varname> <list> <index>
;; set <varname> to <index>th element of <list>
*script exec !varset _listget_a1 "%{\1}"
*script exec !varset _listget_a2 "%{\2}"
*script exec !varset _listget_a3 "%{\3}"
*script exec !varset _listget_i 1
*script label loop
*script gotoif ("%{_listget_i}" = "%{_listget_a3}") found
*script exec !varset _listget_a2 "%{_listget_a2:_}"
*script exec !varadd _listget_i 1
*script gotoif ("%{_listget_a2}" <> "") loop
*script exec !varset %{_listget_a1} "empty"
*script goto clean
*script label found
*script exec !varset %{_listget_a1} "%{_listget_a2:}"
*script label clean
*script exec !varremove _listget_a1
*script exec !varremove _listget_a2
*script exec !varremove _listget_a3
*script exec !varremove _listget_i
*script ~bang


;*script bang !_test_listget
;*script exec !varset foo "a:b:c:d"
;
;*script exec !listget bar %{foo} 0
;*script exec !varshow bar
;
;*script exec !listget bar %{foo} 1
;*script exec !varshow bar
;
;*script exec !listget bar %{foo} 2
;*script exec !varshow bar
;
;*script exec !listget bar %{foo} 3
;*script exec !varshow bar
;
;*script exec !listget bar %{foo} 4
;*script exec !varshow bar
;
;*script exec !listget bar %{foo} 5
;*script exec !varshow bar
;*script ~bang


*script bang !listlen ;<varname> <list>
;; set <varname> to number of elements in <list>
*script exec !varset _listlen_a1 "%{\1}"
*script exec !varset _listlen_a2 "%{\2}"
*script exec !varset _listlen_w "%{_listlen_a2}:empty"
*script exec !varset _listlen_i 0
*script label loop
*script gotoif ("%{_listlen_w:}" = "empty") done
*script exec !ifeval ("%{_listlen_w:}" <> "") '|varadd _listlen_i 1'
*script exec !varset _listlen_w "%{_listlen_w:_}"
*script goto loop
*script label done
*script exec !varset %{_listlen_a1} %{_listlen_i}
*script exec !varremove _listlen_a1
*script exec !varremove _listlen_a2
*script exec !varremove _listlen_w
*script exec !varremove _listlen_i
*script ~bang


;*script bang !_test_listlen
;*script exec !listlen foo "a:b:c:d:empty"
;*script exec !varshow foo
;
;*script exec !listlen foo "a:b:c:d"
;*script exec !varshow foo
;
;*script exec !listlen foo "empty"
;*script exec !varshow foo
;
;*script exec !listlen foo "a:b:empty:c:empty"
;*script exec !varshow foo
;
;*script exec !listlen foo "a:b:c:d:empty"
;*script exec !varshow foo
;
;*script exec !listlen foo "empty:empty:empty:empty"
;*script exec !varshow foo
;
;*script exec !listlen foo "a"
;*script exec !varshow foo
;
;*script exec !listlen foo "a:b"
;*script exec !varshow foo
;
;*script exec !listlen foo ":empty:empty"
;*script exec !varshow foo
;*script ~bang


*script bang !listput ;<listname> <element> <index>
;; overwrite <index>th element of list <listname> to <element>
*script exec !varset _listput_a1 "%{\1}"
*script exec !varset _listput_a2 "%{\2}"
*script exec !varset _listput_a3 "%{\3}"
*script exec !varset _listput_w "{%{_listput_a1}}"
*script exec !varset _listput_w "%%{_listput_w}"
*script exec !varset _listput_k "X"
*script exec !varset _listput_i 1
*script label loop
*script gotoif ("%{_listput_i}" >= "%{_listput_a3}") done
*script exec !varset _listput_k "%{_listput_k}:%{_listput_w:}"
*script exec !varset _listput_w "%{_listput_w:_}"
*script exec !varadd _listput_i 1
*script goto loop
*script label done
*script exec !ifeval ("%{_listput_w:_}" = "") '|varset _listput_k "%{_listput_k}:%{_listput_a2}"' else '|varset _listput_k "%{_listput_k}:%{_listput_a2}:%{_listput_w:_}"'
*script exec !varset %{_listput_a1} "%{_listput_k:_}"
*script exec !varremove _listput_a1
*script exec !varremove _listput_a2
*script exec !varremove _listput_a3
*script exec !varremove _listput_w
*script exec !varremove _listput_k
*script exec !varremove _listput_i
*script ~bang


*script bang !listrem ;<varname> <listname> <index>
;; remove <index>th element of list <listname> to <varname>
*script exec !varset _listrem_a1 "%{\1}"
*script exec !varset _listrem_a2 "%{\2}"
*script exec !varset _listrem_a3 "%{\3}"
*script exec !varset _listrem_w "{%{_listrem_a2}}"
*script exec !varset _listrem_w "%%{_listrem_w}:empty"
*script exec !varset _listrem_k "X"
*script exec !varset _listrem_i 1
*script exec !varset _listrem_f 0
*script label loop
*script gotoif ("%{_listrem_i}" = "%{_listrem_a3}") found
*script exec !varset _listrem_k "%{_listrem_k}:%{_listrem_w:}"
*script label skip
*script exec !varset _listrem_w "%{_listrem_w:_}"
*script exec !varadd _listrem_i 1
*script gotoif ("%{_listrem_w}" <> "empty") loop
*script gotoif ("%{_listrem_f}" = "1") save
*script goto clean
*script label found
*script exec !varset _listrem_f 1
*script exec !varset %{_listrem_a1} %{_listrem_w:}
*script goto skip
*script label save
*script exec !varset _listrem_k "%{_listrem_k:_}"
*script exec !ifeval ("%{_listrem_k}" = "") '|varset %{_listrem_a2} "empty"' else '|varset %{_listrem_a2} "%{_listrem_k}"'
*script label clean
*script exec !varremove _listrem_a1
*script exec !varremove _listrem_a2
*script exec !varremove _listrem_a3
*script exec !varremove _listrem_w
*script exec !varremove _listrem_k
*script exec !varremove _listrem_i
*script exec !varremove _listrem_f
*script ~bang


*script bang !listremlast ;<varname> <listname>
;; remove last element of list <listname> to <varname>
*script exec !varset _listremlast_a1 "%{\1}"
*script exec !varset _listremlast_a2 "%{\2}"
*script exec !varset _listremlast_w "{%{_listremlast_a2}}"
*script exec !varset _listremlast_w "%%{_listremlast_w}:empty"
*script exec !varset _listremlast_k "X"
*script gotoif ("%{_listremlast_w:}" = "empty") clean
*script label loop
*script gotoif ("%{_listremlast_w:}" = "empty") clean
*script gotoif ("%{_listremlast_w:_}" = "empty") atlast
*script exec !varset _listremlast_k "%{_listremlast_k}:%{_listremlast_w:}"
*script exec !varset _listremlast_w "%{_listremlast_w:_}"
*script goto loop
*script label atlast
*script exec !varset %{_listremlast_a1} "%{_listremlast_w:}"
*script exec !varset _listremlast_k "%{_listremlast_k:_}"
*script exec !ifeval ("%{_listremlast_k}" = "") '|varset %{_listremlast_a2} "empty"' else '|varset %{_listremlast_a2} "%{_listremlast_k}"'
*script label clean
*script exec !varremove _listremlast_a1
*script exec !varremove _listremlast_a2
*script exec !varremove _listremlast_w
*script exec !varremove _listremlast_k
*script ~bang


*script bang !listrev ;<listname>
;; reverse order of elements in list <listname>
*script exec !varset _listrev_a1 "%{\1}"
*script exec !varset _listrev_a2 "%{\2}"
*script exec !varset _listrev_w "{%{_listrev_a1}}"
*script exec !varset _listrev_w "%%{_listrev_w}:empty"
*script exec !varset _listrev_k "empty"
*script gotoif ("%{_listrev_w}" = ":empty") clean
*script gotoif ("%{_listrev_w:}" = "empty") clean
*script label loop
*script gotoif ("%{_listrev_w}" = "empty") done
*script exec !ifeval ("%{_listrev_k}" = "empty") '|varset _listrev_k "%{_listrev_w:}"' else '|varset k "%{_listrev_w:}:%{_listrev_k}"'
*script exec !varset _listrev_w "%{_listrev_w:_}"
*script goto loop
*script label done
*script exec !varset %{_listrev_a1} %{_listrev_k:_}
*script label clean
*script exec !varremove _listrev_a1
*script exec !varremove _listrev_a2
*script ~bang


*script bang !listswap ;<listname> <indexA> <indexB>
;; swap <indexA>th and <indexB>th elements of list <listname>
*script exec !varset _listswap_a1 "%{\1}"
*script exec !varset _listswap_a2 "%{\2}"
*script exec !varset _listswap_a3 "%{\3}"
*script exec !varset _listswap_e "{%{_listswap_a1}}"
*script exec !varset _listswap_e "%%{_listswap_e}"
*script exec !listget _listswap_t1 %{_listswap_e} %{_listswap_a2}
*script exec !listget _listswap_t2 %{_listswap_e} %{_listswap_a3}
*script exec !listput %{_listswap_a1} %{_listswap_t2} %{_listswap_a2}
*script exec !listput %{_listswap_a1} %{_listswap_t1} %{_listswap_a3}
*script exec !varremove _listswap_a1
*script exec !varremove _listswap_a2
*script exec !varremove _listswap_a3
*script exec !varremove _listswap_e
*script exec !varremove _listswap_t1
*script exec !varremove _listswap_t2
*script ~bang

Posted by member 182 on 2004-07-19 00:14:05 link

handy++

=)