Nested templated data: Difference between revisions

Line 163:
 
=={{header|M2000 Interpreter}}==
We can use ? as undefined value. Is an object of internal type VarItem. So we have two big tuples, the second one has two "unused" places, with type of Varitem.
 
<lang M2000 Interpreter>
Line 170 ⟶ 169:
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
Payload = lambda (a)->{
unused k=listeach(a)
inner=lambda unused, plim=0 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 {
select caseif type$(a(k^))="mArray" then
case "mArray"
Append res, (Lambda(a(k^)),)
Case "VarItem" ' for more than one line need to place in a blockelse
{ curpayload$="Payload#"+trim$(str$(array(k)))
 
Append res, ("Unused#pos"+trim$(str$(p)),) ' one item tuple append to res
appendif unusednot exist(payloads, pcurpayload$) Then
p++ if not exist(used, curpayload$) Then
} Append res, ("missing#pos"+trim$(str$(p)),)
else case append misspayloads, p:=curpayload$
{ else
Append res, ("Payload#"+trim$(str$(array(k))),) ' one item tuple append to res
p++ Append res, (curpayload$,)
} End if
end select 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), unusedpayloads, misspayloads
}
Expand$ =lambda$ (a as array, unused as list, misspayloads as list)-> {
Read ? space$
\\ we can pass a tuple of two arguments or two arguments
Read a as array
if empty then Data!a : Read a as array, unused as list else read unused as list
inner$= lambda$ (a, feed$=" ")->{
k=each(a)
Line 222 ⟶ 260:
=res$+"]"
}
ifdocument len(unused)>1$="Unused thenPayloads"+{
}
if len(unused)>0 then
un=each(unused)
lim=len(unused)-1
document unused$="Unused: "
while un {
unused$="pos "+streval$(eval(un))+{
if un^<lim then unused$=", "}
}
=inner$(a)+{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
result$=Expand$(Payload(t))
m=Payload(Data t, (((1,?10), (3,4,?16),5),))
While not empty {
clipboard result$+Expand$(array(m,0), array(m,1))
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$
report Clipboard$
</lang>
{{out}}
<pre style="height:30ex;overflow:scroll">
Payloads:
[[['Payload#1', 'Payload#2'],
['Payload#3', 'Payload#4', 'Payload#1'],0
'Payload#5']]1
Payload#2
[[['Payload#1', 'Unused#pos1'],
['Payload#3', 'Payload#4', 'Unused#pos4'],
'Payload#5']]4
Payload#5
Unused: pos 1, pos 4
Payload#6
Template:
(((1, 2),
(3, 4, 1),
5))
Template with Payloads:
[[['Payload#1', 'Payload#2'],
['Payload#3', 'Payload#4', 'Payload#1'],
'Payload#5']]
Unused Payloads
Payload#0
Payload#6
Payloads:
Payload#0
Payload#1
Payload#2
Payload#3
Payload#4
Payload#5
Payload#6
Template:
(((1, 10),
(3, 4, 16),
5))
Template with Payloads:
[[['Payload#1', 'missing#pos2'],
['Payload#3', 'Payload#4', 'missing#pos5'],
'Payload#5']]
Unused Payloads
Payload#0
Payload#6
Payload#2
Missing in position:
Payload#10-pos2
Payload#16-pos5
 
</pre >
 
Anonymous user