Y combinator: Difference between revisions

m
m (→‎{{header|Wren}}: Changed to Wren S/H)
Line 318:
 
 
The version below works with [[ALGOL 68 Genie]] 3.45.40 tested with Linux kernel release 6.67.94-200.fc39.x86_64.
 
N.B. 4 warnings are issued of the form
Line 339:
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( PROC( F( X x , INT arg ) FINT: funcx( genx ,)( Xarg ) )( 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 , )
;
 
PROC fac gen = ( F f ) F: fac( f , ) ;
 
#
factorial = Y_combinator( fac_gen ) ;
#
 
Line 372 ⟶ 370:
#
fib_gen =
fib =>
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
( F fib , INT n ) INT:
( 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 ) ;
#
 
Line 389:
 
 
#
# for ( i = 1 ; i <= 12 ; i++) { consoleprocess.logstdout.write( " " + factorial( i ) ) ; } #
#
 
INT nofacs = 12 ;
printf( ( $ l , "TheHere are the first " , g( 0 ) , " factorials." , l $ , nofacs ) ) ;
FOR i TO nofacs
DO
printf( ( $ " " , g( 0 ) , l $ , factorial( i ) ) )
OD ;
print( newline ) ;
 
 
#
# for ( i = 1 ; i <= 12 ; i++) { consoleprocess.logstdout.write( " " + fibonacci( i ) ) ; } #
#
 
INT nofibs = 12 ;
printf( (
printf( ( $ l , "TheHere are the first " , g( 0 ) , " fibonacci numbers." , l $ , nofibs ) ) ;
, nofibs
) )
FOR i TO nofibs
DO
printf( ( $ " " , g( 0 ) , l $ , fibonacci( i ) ) )
OD ;
print( newline )
 
END</syntaxhighlight>
5

edits