Y combinator: Difference between revisions

Content added Content deleted
(→‎{{header|Quackery}}: added some more commentary)
Line 316: Line 316:
-->
-->


The version below works with Algol 68 Genie 2.8.4 tested with Linux kernel release 5.16.13-200.fc35.x86_64
The version below works with Algol 68 Genie 2.8.4 tested with Linux kernel release 5.18.5-200.fc36.x86_64


<lang algol68>BEGIN
<lang algol68>BEGIN
Line 328: Line 328:




# Y_combinator = f => ( x => x( x ) )( x => f( arg => x( x )( arg ) ) ) ; #
# Y_combinator = 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:
Line 341: Line 341:




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


F factorial =
PROC( F ) F fac gen = ( F fac ) F:
y combinator(
( ( F fac , INT n ) INT: IF n = 0 THEN 1 ELSE n * fac( n - 1 ) FI )
( F fac ) F:
( ( F fac , INT n ) INT: IF n = 0 THEN 1 ELSE n * fac( n - 1 ) FI )
( fac , )
( fac , )
)
;
;




#
# fib_gen = fib => ( n => ( ( n === 0 ) ? 0 : ( n === 1 ) ? 1 : fib( n - 2 ) + fib( n - 1 ) ) ) ; #
fibonacci =
Y_combinator(
fib => ( n => ( ( n === 0 ) ? 0 : ( n === 1 ) ? 1 : fib( n - 2 ) + fib( n - 1 ) ) )
)
;
#


F fibonacci =
PROC( F ) F fib gen = ( F fib ) F:
y combinator(
( ( F fib , INT n ) INT: CASE n IN 1 , 1 OUT fib( n - 2 ) + fib( n - 1 ) ESAC )
( F fib ) F:
( ( F fib , INT n ) INT: CASE n IN 1 , 1 OUT fib( n - 2 ) + fib( n - 1 ) ESAC )
( fib , )
( fib , )
)
;
;


# factorial = Y_combinator( fac_gen ) ; #

F factorial = y combinator( fac gen ) ;

# fibonacci = Y_combinator( fib_gen ) ; #

F fibonacci = y combinator( fib gen ) ;