RosettaCodeData/Task/Nested-templated-data/M2000-Interpreter/nested-templated-data.m2000

148 lines
5.0 KiB
Plaintext

Font "Courier New"
cls
Module Checkit {
t=(((1,2), (3,4,1),5),) ' use (1,) for one item tuple
Tuple$ = lambda$ (a, feed$=" ") -> {
\\ we can pass a tuple of two arguments or two arguments
k=each(a)
lim=len(a)-1
res$="("
link a to a() ' to use type$()
while k {
if type$(a(k^))="mArray" then
res$+=Lambda$(array(a, k^),feed$+" ")
if k^<lim then
res$+={,
}+feed$
end if
else
res$+= trim$(str$(array(k)))
if k^<lim then res$+=", "
end if
}
=res$+")"
}
TotalPayload = lambda (a)->{
k=each(a)
link a to a()
res=0
while k {
if type$(a(k^))="mArray" then
res+=Lambda(a(k^))
else
res++
end if
}
=res
}
Payload = lambda (a,payloads as list)->{
misspayloads=List
used=list
inner=lambda misspayloads, p=1, payloads, used (a)-> {
k=each(a)
res=(,)
link a to a()
while k {
if type$(a(k^))="mArray" then
Append res, (Lambda(a(k^)),)
else
curpayload$="Payload#"+trim$(str$(array(k)))
if not exist(payloads, curpayload$) Then
if not exist(used, curpayload$) Then
Append res, ("missing#pos"+trim$(str$(p)),)
append misspayloads, p:=curpayload$
else
Append res, (curpayload$,)
End if
p++
else
Append res, (curpayload$,)
if exist(payloads, curpayload$) then
delete payloads, curpayload$
if not exist(used, curpayload$) then append used, curpayload$
end if
p++
end if
end if
}
=res
}
=inner(a), payloads, misspayloads
}
Expand$ =lambda$ (a as array, unused as list, misspayloads as list)-> {
Read ? space$
inner$= lambda$ (a, feed$=" ")->{
k=each(a)
lim=len(a)-1
res$="["
link a to a() ' to use type$()
while k {
if type$(a(k^))="mArray" then
res$+=Lambda$(array(a, k^),feed$+" ")
if k^<lim then
res$+={,
}+feed$
end if
else
res$+= "'"+array$(k)+"'"
if k^<lim then res$+=", "
end if
}
=res$+"]"
}
document unused$="Unused Payloads"+{
}
if len(unused)>0 then
un=each(unused)
while un {
unused$=" "+eval$(un)+{
}
}
else
unused$=" -"
end if
if len(misspayloads)>0 then
un=each(misspayloads)
lim=len(misspayloads)-1
document missing$="Missing in position: "+{
}
while un {
missing$=" "+eval$(un)+"-pos"+eval$(un,un^)+{
}
}
=inner$(a, space$)+{
}+unused$+missing$
Else
=inner$(a, space$)+{
} + unused$
End if
}
flush
Data t, (((1,10), (3,4,16),5),)
While not empty {
Read t
Document result$="Payloads:"+{
}
p=list
for i=0 to 6 {
Append p, "Payload#"+trim$(str$(i))
result$=" "+eval$(p, i)+{
}
}
result$="Template:"+{
}
result$=" "+Tuple$(t, " ")+{
}
result$="Template with Payloads:"+{
}
m=Payload(t, p)
result$=" "+Expand$(!m, " ")
clipboard result$
}
}
Checkit
Report clipboard$