[D] 함수 타입과 고차함수, 함수 리터럴, 람다
함수의 타입
D는 함수를 일반 변수처럼 사용할 수 있다.
그리고 당연히 변수처럼 쓰려면 타입도 있어야 한다.
함수의 타입 표현은 아래와 같다.
반환타입 function(인자타입, ...)
그리고 함수 타입은 그 자체로 함수의 포인터와 같다. 따라서 함수를 넣으려면 함수의 주소를 집어넣어야 한다.
이런 식으로 말이다.


function과 비슷한 놈으로 delegate가 있지만, 그건 멤버함수를 표현할때 쓰인다. 나중에 다루겠다.
고차함수
고차함수라는 개념이 있다. 함수를 받아먹는 함수라는 뜻이다.
사용자는 원하는 함수를 고차함수에 전달해서, 고차함수가 그 함수를 호출해 원하는 결과물을 출력하도록 유도한다.
아래 코드는 그에 대한 간단한 예다.
고차함수 just_runner는 인자와 반환이 없는 함수를 받아서 그대로 호출만 한다.

잘 도는걸 볼 수 있다.
여기에서는 예를 들기 위해 고차함수를 아주 간단하게만 만들었지만, 보통은 더 복잡하고 많은 일들을 대신해준다.
함수 리터럴
여튼 저런 코드는 좀 불편한 점이 있다. 고차함수에 전달하는 함수가 전달 범위 외에 있다는 것이다. 보려면 눈을 좀 올려야 한다.
게다가 저 boom이라는 함수가 1회용이라면? 저걸 굳이 저렇게 선언할 필요가 있을까?
이를 위한 것이 바로 함수 리터럴이다.
이건 이름없는 함수를 생성해서 함수의 포인터를 바로 반환한다.
function** 반환타입(인자타입, ...) { ... }**
위의 코드를 함수 리터럴로 바꾸면 이렇게 된다.


함수 리터럴 축약
만약 해당 리터럴을 받는 측의 타입이 이미 명시돼있다면, function 키워드와, 반환타입, 인자타입 등을 지워버릴 수 있다.

훨씬 깔끔해진다.
람다
람다는 다시 간소화된 형태의 함수 리터럴이라고 할 수도 있겠다.
람다함수의 몸체는 하나의 표현식으로 표현된다.
function 반환타입(인자, ...) => 표현식
보통 고차함수에 전달하는 함수들이 하나의 표현식으로 끝나는, 간단한 함수인 경우가 많기 때문이다.
여튼 이런식으로 쓴다.


반환타입도 생략 가능하다.


그렇다.