우리 학교 전산학과 2학년에 Scheme을 배우는 과목이 있다. Scheme은 Functional Programming을 지원하는 언어로 우리가 주로 사용하는 C, JAVA 등의 Procedural programming과 또 다른 세계를 보여준다. 오늘은 비슷한 결과를 낼 수 있는 Javascript로 Scheme 스타일을 좀 따라해봤다.
이 둘 사이에는 여러가지 차이가 있는데 가장 큰 차이는 Functional Language가 Referential transparency를 제공한다는 점에 있다. 자세한 사항을 알아서 찾아보시고;;;
일단 예제 코드를 보자.
var cons = function(a, b) { return function (f) { return f(a, b); } };
var car = function(c) { return c(function(a, b) { return a;}) }
var cdr = function(c) { return c(function(a, b) { return b;})
매우 간단한 세가지 함수를 만들었다.
document.writeln( car(cons("a", "b")) );
document.writeln( car(cdr(cons("a", cons("b", "c")))) );
테스트를 해보면? 결과는 무엇이 나올까?
a
b
대충 짐작 했듯이 cons는 두 값을 pair로 만들어 주고,
car는 첫번째 값을 cdr은 두번째 값을 return하는 매우 심플한 예제다.
var list = function() {
arg = arguments;
var helper = function(i) {
if (arg.length == i) return null;
return cons(arg[i], helper(i+1));
};
return helper(0);
}
var list_ref = function(items, n) {
return (n)? list_ref(cdr(items), n-1) : car(items);
}
var length = function(items) {
return (items)? length(cdr(items))+1 : 0;
}
머리가 아프더라도 마음을 비우고 보면, 가볍게 보인다.
list1 = list(1, 3, list(2, 4, 5), 7, 9);
document.writeln( list_ref(list1, 3) );
document.writeln( length(list_ref(list1, 2)) );
앞에서 만든 cons를 이용해서 list를 만들고, list에 있는 값들을 control하는 함수 들이다.
7
3
결과 위와 같이 7, 3이 출력되게 된다.
왜 그런지는 쉽게 생각할 수 있을 듯 하다.
var $plus = function(a, b) { return a+b; }
var $pair = function(item) {
try { a = car(item); b = cdr(item); } catch(e) { return false; }
return true;
}
var map = function(proc, items) {
return (items)? cons( proc(car(items)), map(proc, cdr(items)) ) : null;
}
var accumulate = function(proc, initial, items) {
return (items)? proc( car(items), accumulate(proc, initial, cdr(items)) ) : initial;
}
var count_leaves = function(t) {
return accumulate($plus, 0,
map(function(a) { return ($pair(a)) ? count_leaves(a) : 1; }, t)
);
}
마지막은 그래도 재미있는 예제로.. map과 accumulate함수 그리고 이를 이용한 트리의 노드 개수를 세는 함수이다.
document.writeln( count_leaves(list ("+", 5, list("*", list("+", 3, 9) , 4) )) )
7
총 노드가 7개(+, 5, *, +, 3, 9 ,4) 이므로...
더 재미있는 예제들은.. 나중에...
혹은
여기를 참조하세요.