Y combinator: Difference between revisions

Content added Content deleted
m (→‎{{header|Wren}}: Changed to Wren S/H)
Line 318: Line 318:




The version below works with [[ALGOL 68 Genie]] 3.4.4 tested with Linux kernel release 6.6.9-200.fc39.x86_64.
The version below works with [[ALGOL 68 Genie]] 3.5.0 tested with Linux kernel release 6.7.4-200.fc39.x86_64


N.B. 4 warnings are issued of the form
N.B. 4 warnings are issued of the form
Line 339: Line 339:
Y_combinator =
Y_combinator =
func_gen => ( x => x( x ) )( x => func_gen( arg => x( x )( arg ) ) )
func_gen => ( x => x( x ) )( x => func_gen( arg => x( x )( arg ) ) )
;
#
#


PROC y combinator = ( PROC( F ) F func gen ) F:
PROC y combinator = ( PROC( F ) F func gen ) F:
( ( X x ) F: x( x ) )
( ( X x ) F: x( x ) )
(
(
(
( PROC( F ) F func gen , X x ) F:
(
( PROC( F ) F func gen , X x ) F:
func gen( ( ( X x , INT arg ) INT: x( x )( arg ) )( x , ) )
func gen( ( ( X x , INT arg ) INT: x( x )( arg ) )( x , ) )
)( func gen , )
)
)( func gen , )
)
;
;




#
#
fac_gen = fac => (n => ( ( n === 0 ) ? 1 : n * fac( n - 1 ) ) ) ;
fac_gen = fac => (n => ( ( n === 0 ) ? 1 : n * fac( n - 1 ) ) )
#
#


PROC fac =
PROC fac gen = ( F fac ) F:
( F fac , INT n ) INT: IF n = 0 THEN 1 ELSE n * fac( n - 1 ) FI
( ( 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 ) ;
factorial = Y_combinator( fac_gen )
#
#


Line 372: Line 370:
#
#
fib_gen =
fib_gen =
fib =>
fib => ( n => ( ( n === 0 ) ? 0 : ( n === 1 ) ? 1 : fib( n - 2 ) + fib( n - 1 ) ) )
( n => ( ( n === 0 ) ? 0 : ( n === 1 ) ? 1 : fib( n - 2 ) + fib( n - 1 ) ) )
;
#
#


PROC fib =
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
( F fib , INT n ) INT:
CASE n + 1 IN 0 , 1 OUT fib( n - 2 ) + fib( n - 1 ) ESAC
)( fib , )
;
;


PROC fib gen = ( F f ) F: fib( f , ) ;


#
#
fibonacci = Y_combinator( fib_gen ) ;
fibonacci = Y_combinator( fib_gen )
#
#


Line 389: Line 389:




#
# for ( i = 1 ; i <= 12 ; i++) { console.log( " " + factorial( i ) ) ; } #
for ( i = 1 ; i <= 12 ; i++) { process.stdout.write( " " + factorial( i ) ) }
#


INT nofacs = 12 ;
INT nofacs = 12 ;
printf( ( $ l , "The first " , g( 0 ) , " factorials." , l $ , nofacs ) ) ;
printf( ( $ l , "Here are the first " , g( 0 ) , " factorials." , l $ , nofacs ) ) ;
FOR i TO nofacs
FOR i TO nofacs
DO
DO
printf( ( $ g( 0 ) , l $ , factorial( i ) ) )
printf( ( $ " " , g( 0 ) $ , factorial( i ) ) )
OD ;
OD ;
print( newline ) ;




#
# for ( i = 1 ; i <= 12 ; i++) { console.log( " " + fibonacci( i ) ) ; } #
for ( i = 1 ; i <= 12 ; i++) { process.stdout.write( " " + fibonacci( i ) ) }
#


INT nofibs = 12 ;
INT nofibs = 12 ;
printf( (
printf( ( $ l , "The first " , g( 0 ) , " fibonacci numbers." , l $ , nofibs ) ) ;
$ l , "Here are the first " , g( 0 ) , " fibonacci numbers." , l $
, nofibs
) )
;
FOR i TO nofibs
FOR i TO nofibs
DO
DO
printf( ( $ g( 0 ) , l $ , fibonacci( i ) ) )
printf( ( $ " " , g( 0 ) $ , fibonacci( i ) ) )
OD
OD ;
print( newline )


END</syntaxhighlight>
END</syntaxhighlight>