First-class functions: Difference between revisions

m
→‎{{header|Phix}}: added syntax colouring the hard way
(Added Arturo implementation)
m (→‎{{header|Phix}}: added syntax colouring the hard way)
Line 2,261:
There is not really any direct support for this sort of thing in Phix, but it is all pretty trivial to manage explicitly.<br>
In the following, as it stands, constant m cannot be used the same way as a routine_id, and a standard routine_id cannot be passed to he first argument of call_composite, but tagging ctable entries so that you know exactly what to do with them does not sound difficult to me.
<!--<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|PHP}}==
7,805

edits