RosettaCodeData/Task/Y-combinator/ALGOL-68/y-combinator-2.alg

94 lines
1.6 KiB
Text
Raw Permalink Normal View History

2023-07-01 11:58:00 -04:00
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 ;
2024-03-06 22:25:12 -08:00
#
Y_combinator =
func_gen => ( x => x( x ) )( x => func_gen( arg => x( x )( arg ) ) )
#
2023-07-01 11:58:00 -04:00
PROC y combinator = ( PROC( F ) F func gen ) F:
2024-03-06 22:25:12 -08:00
( ( X x ) F: x( x ) )
(
2023-07-01 11:58:00 -04:00
(
2024-03-06 22:25:12 -08:00
( PROC( F ) F func gen , X x ) F:
func gen( ( ( X x , INT arg ) INT: x( x )( arg ) )( x , ) )
)( func gen , )
)
2023-07-01 11:58:00 -04:00
;
#
2024-03-06 22:25:12 -08:00
fac_gen = fac => (n => ( ( n === 0 ) ? 1 : n * fac( n - 1 ) ) )
2023-07-01 11:58:00 -04:00
#
2024-03-06 22:25:12 -08:00
PROC fac gen = ( F fac ) F:
( ( F fac , INT n ) INT: IF n = 0 THEN 1 ELSE n * fac( n - 1 ) FI )( fac , )
2023-07-01 11:58:00 -04:00
;
#
2024-03-06 22:25:12 -08:00
factorial = Y_combinator( fac_gen )
2023-07-01 11:58:00 -04:00
#
2024-03-06 22:25:12 -08:00
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 , )
2023-07-01 11:58:00 -04:00
;
2024-03-06 22:25:12 -08:00
#
fibonacci = Y_combinator( fib_gen )
#
F fibonacci = y combinator( fib gen ) ;
#
for ( i = 1 ; i <= 12 ; i++) { process.stdout.write( " " + factorial( i ) ) }
#
2023-07-01 11:58:00 -04:00
INT nofacs = 12 ;
2024-03-06 22:25:12 -08:00
printf( ( $ l , "Here are the first " , g( 0 ) , " factorials." , l $ , nofacs ) ) ;
2023-07-01 11:58:00 -04:00
FOR i TO nofacs
DO
2024-03-06 22:25:12 -08:00
printf( ( $ " " , g( 0 ) $ , factorial( i ) ) )
2023-07-01 11:58:00 -04:00
OD ;
2024-03-06 22:25:12 -08:00
print( newline ) ;
2023-07-01 11:58:00 -04:00
2024-03-06 22:25:12 -08:00
#
for ( i = 1 ; i <= 12 ; i++) { process.stdout.write( " " + fibonacci( i ) ) }
#
2023-07-01 11:58:00 -04:00
INT nofibs = 12 ;
2024-03-06 22:25:12 -08:00
printf( (
$ l , "Here are the first " , g( 0 ) , " fibonacci numbers." , l $
, nofibs
) )
;
2023-07-01 11:58:00 -04:00
FOR i TO nofibs
DO
2024-03-06 22:25:12 -08:00
printf( ( $ " " , g( 0 ) $ , fibonacci( i ) ) )
2023-07-01 11:58:00 -04:00
OD ;
print( newline )
END