̐́Aȉ̃TCg̈płB
http://sourceforge.jp/projects/descartes/wiki/ExLisp2


*** YRrl[^ ***

̃fJgLisṕAN[Wx@\܂񂪁AK̃Ɏ󂯎ăɎԂ@\Ă܂B̂߁AYRrl[^ĕCŎsł܂B 

ƂŁAYRrl[^(Y Combinator)Ƃ́Ał傤H 

ȒPɌ؂Ă܂ƁÃɎōċAvOɑ鏈\ɂ̂łB 

ꂾł͉̂Ƃ킩܂ˁBĂ܂傤B 

1. ֐iɎjɂċAH

̃fJgLispł́AɎSIȖʂ܂B 

āAɎ́A֐ɖO^Ȃ̊֐Lq܂B 

̂悤ȁÅ֐ŁAʂčċAɑ悤ȃvOł傤HӂAċAvOł́A֐`鎞ɂ̊֐̒`̒ŎgĂяoƂɂĎ܂B 

KvZvOōċAg܂傤BƂ΁Aȉ̂悤ɂȂ܂B 




(define (factor n)
        (cond
                ((<= 0) n 1)
                (T (* n (factor (- n 1))))
        )
)


factor֐̒`̒(factor (- n 1)ĂяoĂ܂BXƁA̒l1lŁAfactor֐gĂяoA0ɂȂƂ1Ԃ܂BlԂĂƁAx͌Ăяo֐ɒlԂȂ|ĂɌĂяo֐֕Ԃ܂BʂƂāAŏɌĂяoƂ̈̊K悪ƂĕԂA܂B 

ÃɎ̏ꍇɂ́Aʂ薼ÔȂ֐ł邽߁A֐"factor"ɑ݂̂܂BÅ֐gĂяoɂAOȂ̂ŌĂяo悤Ȃ̂łB 

āA܂I 

2. Rrl[^Ƃ

Rrl[^(combnator)Ƃ́Ał傤B 

ׂĂ݂ƁARϐ܂܂ȂAϐō\Ɏ̂Ƃ̂悤łBϐƂ́AɎ̈ɐݒ肳ϐłBĂȂϐ́ARϐƌĂт܂B 

Rrl[^ɂ́AI, S, KȂǂ̂悤ɂ낢Ȏނ܂BāARrl[^gݍ킹邱ƂɂāACӂ̎\Ƃł܂B 

ł́ARrl[^̒łA[s_Rrl[^ƂȂYRrl[^ɂāA{ŐƎv܂B 

3. s_Rrl[^Ƃ

s_Rrl[^Ƃ͉ł傤 

܂As_Ƃ́Aw̗płB 

a֐f ̕s_łƂ́Af(a) = a 藧Ƃ܂B 

܂AɓꂽlA֐]ʂ̒lɖ߂ƂƂłB 

ł́As_Rrl[^Ƃ́AǂƂł傤B 

́As_Rrl[^ƂĂނ܂Bł́Â̈łuYRrl[^vŐ܂傤B 

YRrl[^ɂ́ACӂ̃_Fɑ΂ 

F(YF) = YF 
Ƃ֌W܂Bقǂ f(a) = a ƌׂĂ݂ĂB\ł邱Ƃ킩܂B 

ƍEtɂĂ݂܂傤B 

  YF = F(YF)

EӂƍӂƓYF̂łɑĂ݂܂傤B 

  YF = F(YF) = F(F(YF))

́Ał\łB 

  YF = F(YF) = F(F(YF)) = F(F(F(cF(F(YF))c)))

̂悤ȐYRrl[^ƂĎgƂɂA_FċAĂяôƓ̏s킹邱Ƃł悤ɂȂ̂łB 

4. YRrl[^Ƃ

ŐYRrl[^Ƃ͈ȉ̂悤Ȍ`Ă܂B 




  fp (f a ((p p) a))
     p (f a ((p p) a))


̃ɎAs_Iy[^łYRrl[^łB 

YRrl[^Ƃ肠AYƂOŒ`܂B 




(define Y 
  fp (f a ((p p) a))
     p (f a ((p p) a)))



āAKvZɎfactƂĒ`܂B 




(define fact 
  fn 
        (cond 
          ((<= n 1) 1) 
           (T (* n (f (- n 1))))))


̂Q̒`ɂA͊܂B 

ł́AǨvZĂ݂܂傤B 




(define Y 
  fp (f a ((p p) a))
     p (f a ((p p) a)))


(define fact 
  fn 
        (cond 
          ((<= n 1) 1) 
           (T (* n (f (- n 1))))))

((Y fact) 5) 



Lt@CɕۑāAfJgLispload܂BfactƂĕۑƂ܂B 

$ descartes lisp-utf8
descartes  Lisp (c) 2010 H.Niwa
Ready
(load fact)
>  (define Y ( (f) (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p)
a)))))))
( (f) (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))))

>  (define fact ( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))))
( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1)))))))

>  ((Y fact) 5)
120

T

5̊K悪vZāA120Ƃďo͂Ă܂B 




łAꂾƁAYƂfactƂ̕ϐgĂ܂ˁB̕ϐ͖{͂Ȃ̂ł͂Ȃł傤H 

xYfactWJ`Ŏs܂傤B 

Y̒ĺAfactsYƑłEnter΁ALispŠ`ŕ\܂BGȃɎɂȂ̂ŁAg܂傤B 




Y
( (f) (f (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))) a))


factlłB 




fact
( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1)))))))


̂QSŕ\ꂽɊ֐gݍ킹āAĎsĂ݂܂傤BȌ`ɑgݍ킹܂B 




((ỸɊ֐ fact̃Ɋ֐) )


łAǨvZsł傤H 




((( (f) (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a)))))) ( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1)))))))) 5)
120

ȂɕGȃɊ֐Ȃ̂ɁA܂III 

̃Ɋ֐łĂAċÅK̏słƖ{Ɏł܂B 

̃fJgLisṕAN[Wx@\܂񂪁AK̃Ɏ󂯎ăɎԂ@\Ă̂ł̂悤ȕGȃɎ̏sł܂B 

ł́Aň^₪т܂B 

̊K̃Ɋ֐ŁA֐ɑȊÕɊ֐͂ǂ`ɕ]Ă̂ł傤H 

܂AɎ֐͂ǂ̂悤Ȍ`Ă̂ł傤H 




(ỸɊ֐ fact̃Ɋ֐)


Ă݂܂傤B 




((( (f) (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))))( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))))


sʂ͂ȂƂɂȂĂ܂܂B 




( (n) (cond ((<= n 1) 1) (T (* n (( (n) (cond ((<= n 1) 1) (T (* n (( (a)((( (p) (( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))) (p p) a)) ( (p) (( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))) (p p) a))) a)) (- n 1)))))) (- n 1))))))


{ɂŊǨvZł̂AĎsĂ݂܂B7āA7̊KvZĂ݂܂傤B 




(( (n) (cond ((<= n 1) 1) (T (* n (( (n) (cond ((<= n 1) 1) (T (* n (( (a)((( (p) (( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))) (p p) a)) ( (p) (( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))) (p p) a))) a)) (- n 1)))))) (- n 1))))))
7)
5040


{ɌvZłĂ܂܂BmɊKvZɊ֐ƂȂĂ悤łBȂɕGłƌvZĂ܂B 

5. YRrl[^g̑̃vO

ǨvZȊOɂAYRrl[^gƍċAgvO܂B 

Xg̒ԂvOƁAtB{ib`vZvO쐬܂B 

Ŏ悤ɂRނ̃Ɋ֐̒`@Ŏ܂BrĂ݂ĂB 

̃vOt@C"Y-combinator"ɕۑ܂B 




; Y-combinator for descartes Lisp/ 

;; Y-combinator

(define Y 
  fp (f a ((p p) a))
     p (f a ((p p) a)))


;; factorial
(define fact 
  fn 
        (cond 
          ((<= n 1) 1) 
           (T (* n (f (- n 1))))))

((Y fact) 5) 

;; Factorial by  type 1
((( (f) (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))))
  ( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))))
  6)

;; Factorial by  type 2
(( (n) (cond ((<= n 1) 1) (T (* n (( (n) (cond ((<= n 1) 1) (T (* n (( (a)
((( (p) (( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))) (p p) a))
 ( (p) (( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))) (p p) a)))
 a)) (- n 1)))))) (- n 1))))))
7)

;; list length

(define length
  fl
        (cond 
          ((equal l ()) 0) 
          ((atom l) 1)
          (T (+ (f (cdr l)) 1))))

((Y length) '(a b c)) 

;; length by  type1
((( (f) (f (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))) a))
 ( (f) ( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (f (cdr l)) 1))))))
 '(1 2 3 4 5 6 7))

;; length by  type2
(( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (( (a) ((( (p) (( (f) ( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (f (cdr l)) 1))))) (p p) a)) ( (p) (( (f) ( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (f (cdr l)) 1))))) (p p) a))) a)) (cdr l)) 1)))) (cdr l)) 1))))
 '(1 2 3 4 5 6 7))

;; Fibonacci number

(define fib
  fn 
        (cond 
          ((= n 0) 0) 
          ((= n 1) 1) 
          (T (+ (f (- n 1)) (f (- n 2))))))


((Y fib) 3)

;; Fibonacci by  type1
((( (f) (f (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))) a))
  ( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))))
  4)

;; Fibonacci by  type2
(( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (( (a) ((( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a)) ( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a))) a)) (- n 1)) (( (a) ((( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a)) ( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a))) a)) (- n 2)))))) (- n 1)) (( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (( (a) ((( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a)) ( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a))) a)) (- n 1)) (( (a) ((( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a)) ( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a))) a)) (- n 2)))))) (-
 n 2))))))
  5)




ł́A܂Ƃ߂ĎsʂȉɎ܂傤B 

GȃɊ֐ɂȂ̂ŁAsԂȂ肪łCɌʂô҂ĂB 




$ descartes -u exapmle/lisp/lisp-utf8
descartes  Lisp (c) 2010 H.Niwa
Ready
(load "example/lisp/y-combinator/y-combinator-utf8")
>  (define Y ( (f) (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p)
a)))))))
( (f) (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))))

>  (define fact ( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))))
( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1)))))))

>  ((Y fact) 5)
120

>  ((( (f) (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))))
( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1)))))))) 6)
720

>  (( (n) (cond ((<= n 1) 1) (T (* n (( (n) (cond ((<= n 1) 1) (T (* n ((
(a) ((( (p) (( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))) (p p)
 a)) ( (p) (( (f) ( (n) (cond ((<= n 1) 1) (T (* n (f (- n 1))))))) (p p)
a))) a)) (- n 1)))))) (- n 1)))))) 7)
5040

>  (define length ( (f) ( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (f (
cdr l)) 1))))))
( (f) ( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (f (cdr l)) 1)))))

>  ((Y length) (quote (a b c)))
3

>  ((( (f) (f (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))
) a)) ( (f) ( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (f (cdr l)) 1)))
))) (quote (1 2 3 4 5 6 7)))
7

>  (( (l) (cond ((equal l ()) 0) ((atom l) 1) (T (+ (( (l) (cond ((equal l (
)) 0) ((atom l) 1) (T (+ (( (a) ((( (p) (( (f) ( (l) (cond ((equal l ())
 0) ((atom l) 1) (T (+ (f (cdr l)) 1))))) (p p) a)) ( (p) (( (f) ( (l) (co
nd ((equal l ()) 0) ((atom l) 1) (T (+ (f (cdr l)) 1))))) (p p) a))) a)) (cdr l)
) 1)))) (cdr l)) 1)))) (quote (1 2 3 4 5 6 7)))
7

>  (define fib ( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (
f (- n 2))))))))
( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2)))))))


>  ((Y fib) 3)
2

>  ((( (f) (f (( (p) (f ( (a) ((p p) a)))) ( (p) (f ( (a) ((p p) a))))
) a)) ( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2)
))))))) 4)
3

>  (( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (( (n) (cond ((= n 0) 0) ((= n
 1) 1) (T (+ (( (a) ((( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (
T (+ (f (- n 1)) (f (- n 2))))))) (p p) a)) ( (p) (( (f) ( (n) (cond ((= n
 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a))) a)) (- n 1)) ((
 (a) ((( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)
) (f (- n 2))))))) (p p) a)) ( (p) (( (f) ( (n) (cond ((= n 0) 0) ((= n 1)
 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a))) a)) (- n 2)))))) (- n 1)) ((
 (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (( (a) ((( (p) (( (f) ( (n) (co
nd ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a)) ( (p)
(( (f) ( (n) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))
) (p p) a))) a)) (- n 1)) (( (a) ((( (p) (( (f) ( (n) (cond ((= n 0) 0)
((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a)) ( (p) (( (f) ( (n
) (cond ((= n 0) 0) ((= n 1) 1) (T (+ (f (- n 1)) (f (- n 2))))))) (p p) a))) a)
) (- n 2)))))) (- n 2)))))) 5)
5

T
Ready

ȏ
