#!/usr/bin/env sh
# -*- wisp -*-
guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples y-combinator) main)' -s "$0" "$@"
; !#
define-module : examples y-combinator
;; Poor mans y-combinator from William Byrds talk: https://www.youtube.com/watch?v=OyfBQmvr2Hc&t=2844s
define fac-pmy-zealous-wisp
:
λ : !
λ : n
:
! !
. n
λ : !
λ : n
if : zero? n
. 1
* n
:
! !
- n 1
define fac-pmy-pragmatic-wisp
:
λ : !
λ : n
(! !) n
λ : !
λ : n
if : zero? n
. 1
* n : (! !) {n - 1}
;; Poor mans y-combinator from William Byrds talk: https://www.youtube.com/watch?v=OyfBQmvr2Hc&t=2844s
define facres-pmy
. (((λ (!)
(λ (n)
((! !) n)))
(λ (!)
(λ (n)
(if (zero? n)
1
(* n ((! !) (- n 1)))))))
5)
;; from rosetta code: https://rosettacode.org/wiki/Y_combinator#Scheme
define Y
λ : h
: λ (x) : x x
λ : g
h : λ args : apply (g g) args
define fac
Y
λ : f
λ : x
if : < x 2
. 1
* x : f : - x 1
define fib
Y
λ : f
λ : x
if : < x 2
. x
+ : f : - x 1
f : - x 2
define : main args
display : fac-pmy-zealous-wisp 5
newline
display : fac-pmy-pragmatic-wisp 5
newline
display facres-pmy
newline
display : fac 6
newline
display : fib 6
newline