Y combinator: Difference between revisions
m
→ALGOL 68
mNo edit summary |
m (→ALGOL 68) |
||
Line 318:
The version below works with [[ALGOL 68 Genie]] 3.
N.B. 4 warnings are issued of the form
Line 326:
These could easily be fixed by changing names, but I believe that doing so would make the code harder to follow.
<syntaxhighlight
# This version needs partial parameterisation in order to work #
Line 336:
#
# Y_combinator = func_gen => ( x => x( x ) )( x => func_gen( arg => x( x )( arg ) ) ) ; #▼
Y_combinator =
;
#
PROC y combinator = ( PROC( F ) F func gen ) F:
( ( X x ) F: x( x ) )
(
(
( PROC( F ) F func gen , X x ) F:
func gen( ( ( X x , INT arg ) INT: x( x )( arg ) )( x , ) )
)
)
;
Line 350 ⟶ 354:
#
▲ Y_combinator( fac => ( n => ( ( n === 0 ) ? 1 : n * fac( n - 1 ) ) ) )
#
PROC fac =
▲ ( ( F fac , INT n ) INT: IF n = 0 THEN 1 ELSE n * fac( n - 1 ) FI )
( fac , )▼
;
#
factorial = Y_combinator( fac_gen ) ;
fib => ( n => ( ( n === 0 ) ? 0 : ( n === 1 ) ? 1 : fib( n - 2 ) + fib( n - 1 ) ) )▼
#
F factorial = y combinator( fac gen ) ;
#
( ( F fib , INT n ) INT: CASE n IN 1 , 1 OUT fib( n - 2 ) + fib( n - 1 ) ESAC )▼
fib_gen =
( fib , )▼
;
#
PROC fib =
;
#
fibonacci = Y_combinator( fib_gen ) ;
#
F fibonacci = y combinator( fib gen ) ;
Line 384 ⟶ 392:
INT nofacs = 12 ;
FOR i TO nofacs
DO
OD ;
# for ( i = 1 ; i <= 12 ; i++) { console.log( " " + fibonacci( i ) ) ; } #
INT nofibs = 12 ;
FOR i TO nofibs
DO
OD
END</syntaxhighlight>
|