First-class functions/Use numbers analogously: Difference between revisions

m
→‎{{header|Phix}}: added syntax colouring the hard way
m (→‎{{header|Phix}}: added syntax colouring the hard way)
Line 1,187:
=={{header|Phix}}==
Just as there is no real support for first class functions, not much that is pertinent to this task for numbers either, but the manual way is just as trivial:
<!--<lang Phix>sequence mtable = {}-->
<span style="color: #004080;">sequence</span> <span style="color: #000000;">mtable</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{<span style="color: #0000FF;">}</span>
 
function multiplier(atom n1, atom n2)
<span style="color: #008080;">function</span> <span style="color: #000000;">multiplier<span style="color: #0000FF;">(<span style="color: #004080;">atom</span> <span style="color: #000000;">n1<span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">n2<span style="color: #0000FF;">)</span>
mtable = append(mtable,{n1,n2})
<span style="color: #000000;">mtable</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append<span style="color: #0000FF;">(<span style="color: #000000;">mtable<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #000000;">n1<span style="color: #0000FF;">,<span style="color: #000000;">n2<span style="color: #0000FF;">}<span style="color: #0000FF;">)</span>
return length(mtable)
<span style="color: #008080;">return</span> <span style="color: #7060A8;">length<span style="color: #0000FF;">(<span style="color: #000000;">mtable<span style="color: #0000FF;">)</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
function call_multiplier(integer f, atom m)
<span style="color: #008080;">function</span> <span style="color: #000000;">call_multiplier<span style="color: #0000FF;">(<span style="color: #004080;">integer</span> <span style="color: #000000;">f<span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">m<span style="color: #0000FF;">)</span>
atom {n1,n2} = mtable[f]
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{<span style="color: #000000;">n1<span style="color: #0000FF;">,<span style="color: #000000;">n2<span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">mtable<span style="color: #0000FF;">[<span style="color: #000000;">f<span style="color: #0000FF;">]</span>
return n1*n2*m
<span style="color: #008080;">return</span> <span style="color: #000000;">n1<span style="color: #0000FF;">*<span style="color: #000000;">n2<span style="color: #0000FF;">*<span style="color: #000000;">m</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
constant x = 2,
<span style="color: #008080;">constant</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2<span style="color: #0000FF;">,</span>
xi = 0.5,
<span style="color: #000000;">xi</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0.5<span style="color: #0000FF;">,</span>
y = 4,
<span style="color: #000000;">y</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">4<span style="color: #0000FF;">,</span>
yi = 0.25,
<span style="color: #000000;">yi</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0.25<span style="color: #0000FF;">,</span>
z = x + y,
<span style="color: #000000;">z</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">y<span style="color: #0000FF;">,</span>
zi = 1 / ( x + y )
<span style="color: #000000;">zi</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span> <span style="color: #0000FF;">/</span> <span style="color: #0000FF;">(</span> <span style="color: #000000;">x</span> <span style="color: #0000FF;">+</span> <span style="color: #000000;">y</span> <span style="color: #0000FF;">)</span>
 
?call_multiplier(multiplier(x,xi),0.5)
<span style="color: #0000FF;">?<span style="color: #000000;">call_multiplier<span style="color: #0000FF;">(<span style="color: #000000;">multiplier<span style="color: #0000FF;">(<span style="color: #000000;">x<span style="color: #0000FF;">,<span style="color: #000000;">xi<span style="color: #0000FF;">)<span style="color: #0000FF;">,<span style="color: #000000;">0.5<span style="color: #0000FF;">)</span>
?call_multiplier(multiplier(y,yi),0.5)
<span style="color: #0000FF;">?<span style="color: #000000;">call_multiplier<span style="color: #0000FF;">(<span style="color: #000000;">multiplier<span style="color: #0000FF;">(<span style="color: #000000;">y<span style="color: #0000FF;">,<span style="color: #000000;">yi<span style="color: #0000FF;">)<span style="color: #0000FF;">,<span style="color: #000000;">0.5<span style="color: #0000FF;">)</span>
?call_multiplier(multiplier(z,zi),0.5)</lang>
<span style="color: #0000FF;">?<span style="color: #000000;">call_multiplier<span style="color: #0000FF;">(<span style="color: #000000;">multiplier<span style="color: #0000FF;">(<span style="color: #000000;">z<span style="color: #0000FF;">,<span style="color: #000000;">zi<span style="color: #0000FF;">)<span style="color: #0000FF;">,<span style="color: #000000;">0.5<span style="color: #0000FF;">)
<!--</lang>-->
{{out}}
<pre>
Line 1,218 ⟶ 1,220:
 
Compared to first class functions, there are (as in my view there should be) significant differences in the treatment of numbers and functions, but as mentioned on that page tagging ctable entries should be quite sufficient.
<!--<lang Phix>sequence ctable = {}-->
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ctable</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{<span style="color: #0000FF;">}</span>
function compose(integer f, g)
<span style="color: #008080;">function</span> <span style="color: #000000;">compose<span style="color: #0000FF;">(<span style="color: #004080;">integer</span> <span style="color: #000000;">f<span style="color: #0000FF;">,</span> <span style="color: #000000;">g<span style="color: #0000FF;">)</span>
ctable = append(ctable,{f,g})
<span style="color: #000000;">ctable</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append<span style="color: #0000FF;">(<span style="color: #000000;">ctable<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #000000;">f<span style="color: #0000FF;">,<span style="color: #000000;">g<span style="color: #0000FF;">}<span style="color: #0000FF;">)</span>
integer cdx = length(ctable)
<span style="color: #004080;">integer</span> <span style="color: #000000;">cdx</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length<span style="color: #0000FF;">(<span style="color: #000000;">ctable<span style="color: #0000FF;">)</span>
return cdx
<span style="color: #008080;">return</span> <span style="color: #000000;">cdx</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function call_composite(integer cdx, atom x)
<span style="color: #008080;">function</span> <span style="color: #000000;">call_composite<span style="color: #0000FF;">(<span style="color: #004080;">integer</span> <span style="color: #000000;">cdx<span style="color: #0000FF;">,</span> <span style="color: #004080;">atom</span> <span style="color: #000000;">x<span style="color: #0000FF;">)</span>
integer {f,g} = ctable[cdx]
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{<span style="color: #000000;">f<span style="color: #0000FF;">,<span style="color: #000000;">g<span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ctable<span style="color: #0000FF;">[<span style="color: #000000;">cdx<span style="color: #0000FF;">]</span>
return f(g(x))
<span style="color: #008080;">return</span> <span style="color: #000000;">f<span style="color: #0000FF;">(<span style="color: #000000;">g<span style="color: #0000FF;">(<span style="color: #000000;">x<span style="color: #0000FF;">)<span style="color: #0000FF;">)</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function plus1(atom x)
<span style="color: #008080;">function</span> <span style="color: #000000;">plus1<span style="color: #0000FF;">(<span style="color: #004080;">atom</span> <span style="color: #000000;">x<span style="color: #0000FF;">)</span>
return x+1
<span style="color: #008080;">return</span> <span style="color: #000000;">x<span style="color: #0000FF;">+<span style="color: #000000;">1</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
function halve(atom x)
<span style="color: #008080;">function</span> <span style="color: #000000;">halve<span style="color: #0000FF;">(<span style="color: #004080;">atom</span> <span style="color: #000000;">x<span style="color: #0000FF;">)</span>
return x/2
<span style="color: #008080;">return</span> <span style="color: #000000;">x<span style="color: #0000FF;">/<span style="color: #000000;">2</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
constant m = compose(halve,plus1)
<span style="color: #008080;">constant</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">compose<span style="color: #0000FF;">(<span style="color: #000000;">halve<span style="color: #0000FF;">,<span style="color: #000000;">plus1<span style="color: #0000FF;">)</span>
?call_composite(m,1) -- displays 1
<span style="color: #0000FF;">?<span style="color: #000000;">call_composite<span style="color: #0000FF;">(<span style="color: #000000;">m<span style="color: #0000FF;">,<span style="color: #000000;">1<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- displays 1</span>
?call_composite(m,4) -- displays 2.5</lang>
<span style="color: #0000FF;">?<span style="color: #000000;">call_composite<span style="color: #0000FF;">(<span style="color: #000000;">m<span style="color: #0000FF;">,<span style="color: #000000;">4<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- displays 2.5
<!--</lang>-->
 
=={{header|PicoLisp}}==
7,820

edits