Y combinator: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Changed to Wren S/H) |
m (→ALGOL 68) |
||
Line 318: | Line 318: | ||
The version below works with [[ALGOL 68 Genie]] 3. |
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 ) ) |
|||
⚫ | |||
( |
( |
||
⚫ | |||
⚫ | |||
( |
func gen( ( ( X x , INT arg ) INT: x( x )( arg ) )( x , ) ) |
||
)( 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 )( 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 => |
|||
( 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: |
|||
⚫ | |||
)( 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++) { process.stdout.write( " " + factorial( i ) ) } |
|||
# |
|||
INT nofacs = 12 ; |
INT nofacs = 12 ; |
||
printf( ( $ l , " |
printf( ( $ l , "Here are the first " , g( 0 ) , " factorials." , l $ , nofacs ) ) ; |
||
FOR i TO nofacs |
FOR i TO nofacs |
||
DO |
DO |
||
printf( ( $ g( 0 ) |
printf( ( $ " " , g( 0 ) $ , factorial( i ) ) ) |
||
OD ; |
OD ; |
||
print( newline ) ; |
|||
# |
|||
for ( i = 1 ; i <= 12 ; i++) { process.stdout.write( " " + fibonacci( i ) ) } |
|||
# |
|||
INT nofibs = 12 ; |
INT nofibs = 12 ; |
||
printf( ( |
|||
$ l , "Here are the first " , g( 0 ) , " fibonacci numbers." , l $ |
|||
, nofibs |
|||
) ) |
|||
⚫ | |||
FOR i TO nofibs |
FOR i TO nofibs |
||
DO |
DO |
||
printf( ( $ g( 0 ) |
printf( ( $ " " , g( 0 ) $ , fibonacci( i ) ) ) |
||
OD |
OD ; |
||
print( newline ) |
|||
END</syntaxhighlight> |
END</syntaxhighlight> |