lazy evaluation은 최종 확정된 값이 입력되었을때 계산하라는 의미이며 함수형으로 구현된다.
일일이 계산을 다 하면 컴퓨터 내에서 자원낭비가 예상될 경우에 사용한다.
기본원리는 커링이고 함수형 구현을 위해 람다나 콜백을 이용한다.
아래 코드는 리스프에서 최종적으로 lazy evaluation을 사용하는 형태인데 이 한줄의 코드를 위해 구현해야 하는 코드를 작성하는 방법은 당연하게도 배워야 한다. 자세한 내용은 책을 참고해 주기를 바란다.
( take 10 ( lazy-mapcar #'sqrt *integers* )
이하 책, 콘래드 바스키 저, 조태훈 역 만들면서 배우는 리스프 프로그래밍 한빛미디어 454페이지에 있다.
람다를 우선 배워서 함수반환을 하는걸 알아야 하고 다음으로 매크로 작성을 알아야 한다. 매크로를 통해 입력받은 리스트를 함수의 연쇄 작용으로 나열한 다음 값이 들어오면 실행한다. #’기호는 함수 심볼인데 리스트가 아닌 함수로 이해시키기 위한 것이다. 이는 haskell에서는 applicative가 된다. 반면 *integer* 전역변수는 배열이나 리스트처럼 펑터(Functor) 가 되며 map기능을 하는 lazy-mapcar는 haskell에서 모나드가 된다. 자바스크립트에서도 이와 유사한 연쇄를 일반적으로 사용한다.
이 책은 더이상 나오지 않는데 설명도 너무 어렵고 함수형을 모르는 사람은 빠진 설명이 너무 많아 이해하기 어렵다. 그러나 리스프의 전반적인 특징을 이해하기 위해서는 이 책을 봐야 도움이 된다. 요령은 함수형에 관한 공부를 javascript나 haskell등을 통하여 따로 하면서 필요한 사항을 이 책을 정독하면서 확인하는 것이다. 이 책이 발간된지 10년이 넘었고 내용이 legacy 할수도 있지만 현재의 함수형 프로그래밍의 기본원리는 소개되어 있다. 문제는 소개와 응용만 있고 그 중간에 이해시킬수 있는 설명이 다 빠져있어서 문제다.
리스프는 다른 함수형언어와 마찬가지로 이해하기 전까지는 이해가 쉽지않다. 괄호의 연쇄 자체는 이해가 되나 괄호가 너무 많아지면 실제 코딩에서 부담이 되며 javascript에서 볼수있는 중괄호 중첩을 생각하면 이해될것이다. haskell에서는 괄호중첩을 피하기 위한 장치가 있다. 그리고 리스프는 방언이 많은데 haskell은 단일화되어 있어 처음 공부할때는 리스프와 하스켈 둘중에서 haskell이 나을지도 모른다.