93 lines
1.6 KiB
Text
93 lines
1.6 KiB
Text
BEGIN
|
|
|
|
# This version needs partial parameterisation in order to work #
|
|
# The commented code is JavaScript aka ECMAScript ES6 #
|
|
|
|
|
|
MODE F = PROC( INT ) INT ;
|
|
MODE X = PROC( X ) F ;
|
|
|
|
|
|
#
|
|
Y_combinator =
|
|
func_gen => ( x => x( x ) )( x => func_gen( arg => x( x )( arg ) ) )
|
|
#
|
|
|
|
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 , ) )
|
|
)( func gen , )
|
|
)
|
|
;
|
|
|
|
|
|
#
|
|
fac_gen = fac => (n => ( ( n === 0 ) ? 1 : n * fac( n - 1 ) ) )
|
|
#
|
|
|
|
PROC fac gen = ( F fac ) F:
|
|
( ( F fac , INT n ) INT: IF n = 0 THEN 1 ELSE n * fac( n - 1 ) FI )( fac , )
|
|
;
|
|
|
|
|
|
#
|
|
factorial = Y_combinator( fac_gen )
|
|
#
|
|
|
|
F factorial = y combinator( fac gen ) ;
|
|
|
|
|
|
#
|
|
fib_gen =
|
|
fib =>
|
|
( n => ( ( n === 0 ) ? 0 : ( n === 1 ) ? 1 : fib( n - 2 ) + fib( n - 1 ) ) )
|
|
#
|
|
|
|
PROC fib gen = ( F fib ) F:
|
|
(
|
|
( F fib , INT n ) INT:
|
|
CASE n + 1 IN 0 , 1 OUT fib( n - 2 ) + fib( n - 1 ) ESAC
|
|
)( fib , )
|
|
;
|
|
|
|
|
|
#
|
|
fibonacci = Y_combinator( fib_gen )
|
|
#
|
|
|
|
F fibonacci = y combinator( fib gen ) ;
|
|
|
|
|
|
#
|
|
for ( i = 1 ; i <= 12 ; i++) { process.stdout.write( " " + factorial( i ) ) }
|
|
#
|
|
|
|
INT nofacs = 12 ;
|
|
printf( ( $ l , "Here are the first " , g( 0 ) , " factorials." , l $ , nofacs ) ) ;
|
|
FOR i TO nofacs
|
|
DO
|
|
printf( ( $ " " , g( 0 ) $ , factorial( i ) ) )
|
|
OD ;
|
|
print( newline ) ;
|
|
|
|
|
|
#
|
|
for ( i = 1 ; i <= 12 ; i++) { process.stdout.write( " " + fibonacci( i ) ) }
|
|
#
|
|
|
|
INT nofibs = 12 ;
|
|
printf( (
|
|
$ l , "Here are the first " , g( 0 ) , " fibonacci numbers." , l $
|
|
, nofibs
|
|
) )
|
|
;
|
|
FOR i TO nofibs
|
|
DO
|
|
printf( ( $ " " , g( 0 ) $ , fibonacci( i ) ) )
|
|
OD ;
|
|
print( newline )
|
|
|
|
END
|