Jump to content

Y combinator: Difference between revisions

m
mNo edit summary
Line 318:
 
 
The version below works with [[ALGOL 68 Genie]] 3.14.34 tested with Linux kernel release 6.16.189-200.fc37fc39.x86_64.
 
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 langline="algol681">BEGIN
 
# 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 =
# 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 , )
)
;
Line 350 ⟶ 354:
 
#
fac_gen Y_combinator(= fac => ( n => ( ( n === 0 ) ? 1 : n * fac( n - 1 ) ) ) );
factorial =
Y_combinator( fac => ( n => ( ( n === 0 ) ? 1 : n * fac( n - 1 ) ) ) )
;
#
 
PROC fac =
F factorial =
( ( F fac , INT n ) INT: IF n = 0 THEN 1 ELSE n * fac( n - 1 ) FI )
y combinator(
( F fac ) F:
( ( F fac , INT n ) INT: IF n = 0 THEN 1 ELSE n * fac( n - 1 ) FI )
( fac , )
)
;
 
PROC fac gen = ( F f ) (F: fac( f , ) ;
 
#
factorial = Y_combinator( fac_gen ) ;
fibonacci =
Y_combinator(
fib => ( n => ( ( n === 0 ) ? 0 : ( n === 1 ) ? 1 : fib( n - 2 ) + fib( n - 1 ) ) )
)
;
#
 
F factorial = y combinator( fac gen ) ;
F fibonacci =
 
y combinator(
 
( F fib ) F:
#
( ( F fib , INT n ) INT: CASE n IN 1 , 1 OUT fib( n - 2 ) + fib( n - 1 ) ESAC )
fib_gen =
( fib , )
fib => ( n => ( ( n === 0 ) ? 0 : ( n === 1 ) ? 1 : fib( n - 2 ) + fib( n - 1 ) ) )
)
;
#
 
PROC fib =
( ( F fib , INT n ) INT: CASE n IN+ 1 IN 0 , 1 OUT fib( n - 2 ) + fib( n - 1 ) ESAC )
;
 
PROC fib gen = ( F f ) (F: fib( f , ) ;
 
#
fibonacci = Y_combinator( fib_gen ) ;
#
 
F fibonacci = y combinator( fib gen ) ;
 
 
Line 384 ⟶ 392:
 
INT nofacs = 12 ;
printprintf( ( $ l , "The first " , wholeg( nofacs , 0 ) , " factorials." , newlinel $ , nofacs ) ) ;
FOR i TO nofacs
DO
printprintf( whole( factorial$ g( i0 ) , -11l $ , factorial( i ) ) )
OD ;
 
print( ( newline , newline ) ) ;
 
# for ( i = 1 ; i <= 12 ; i++) { console.log( " " + fibonacci( i ) ) ; } #
 
INT nofibs = 12 ;
printprintf( ( $ l , "The first " , wholeg( nofibs , 0 ) , " fibonacci numbers." , newlinel $ , nofibs ) ) ;
FOR i TO nofibs
DO
printprintf( whole( fibonacci$ g( i0 ) , -11l $ , fibonacci( i ) ) )
OD ;
print( newline )
 
END</syntaxhighlight>
5

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.