일단 call by name이 뭔지는 대강 알겠다 SIMULA나 ALGOL에서 지원하는 매개변수 전달방식이고
일종의 텍스트? 코드의 일부??라 할 수 있는 이름을 실 매개변수로 받아서
MACRO처럼 치환하다시피 처리해주는데
MACRO와의 차이점은 call by name은 평가를 미루는 방법으로써 실행중 해당 지점에서 처리해주는 방식으로써
인터프리터 방식과 어울린다는 점이고
그러다보니 MACRO보다 더욱 예측하기 불편하고 많이 쓰이는 방법은 아니되
같은 형식의 함수도 매개변수를 어떻게 쓰느냐에 따라 다양한 기능으로 변화시킬 수 있다는 장점이 있다.
까지 내가 수업듣고 찾아보고 해서 얻은 call by name에 대한 개념인데
이게 틀린게 있음 좀 알려주고
내가 더 알고 싶은 것은
call by name방식으로 전달하기 위해선 떵크? 라고 하는 ( 코드 포인터, 참조 환경( 링크 ) ) 가 필요하다고 하는데
ALGOL 예시를 보면 코드 포인터나 참조 환경을 인자로 전달하거나 하지는 않는다.
그렇다면 이 떵크?? 라고 하는 녀석은 내부에서 해석기가 알아서 처리되는 부분이냐?
그리고 부프로그램 그러니까 프로시저를 매개변수로 사용하는거랑
call by name이랑은 무슨 차이가 있는지?? 알고싶넹 그냥 읽어보면 똑같은 것 같은디
븅신 도와주면 나중에 복받음
응 워낙 오래 전에 본 거라 틀릴 수도 있지만 적어볼께. Thunk 는 다른 여러 곳에 등장하는 말이지만 calll-by-name이 나오면서 ALGOL에서 언급되는 Thunk 는 복잡한 표현식이 파라미터로 들어올 때 컴파일러가 서브루틴을 호출하는 놈의 환경에서 계산을 위해 알아서 만들어주는 보조 서브루틴이야. 그러므로 "해석기가 알아서 처리하는" 부분이라고 할 수 있어. 그런데 Lisp 이나 다른 call-by-name 을 쓰는 언어에서는 좀 더 적극적으로 이걸 "익명 함수"의 형태로 사용자가 직접 만들 수 있어.
두 번째 질문은, 서브루틴을 파라미터로 받으면, 실행되는 환경은 파라미터로 사용되는 서브루틴의 독립된 블럭으로 바뀌고, 취할 수 있는 값은 서브루틴이 돌려주는 값 밖에 얻을 수 없어. 그런데 call-by-name 은 서브루틴을 파라미터로 받는 것과 똑같은 것도 할 수 있으면서, 호출하는 놈의 환경에 존재하는 것들을 표현식으로 만들어서 훨씬 다양하고 복잡한 것들을 할 수 있어. 그런데 여기에도 단점은 물론 있어. 일단 성능에서 좀 불이익이 있고(Thunk 가 돌아가는 것도 비용이야), 이 방식으로는 call-by-reference 는 멀쩡히 하는 swap 같은 걸 할 수 없어.
혹 내가 잘못 쓴게 있다면 고쳐주면 대환영이야.
써놓고 다시 보니 이상한 걸 찾아서 추가할께. 익명함수로 Thunk 처럼 동작하게 만드려면 익명함수의 파라미터가 없어야 돼.
와우.. 궁금한게 시원하게 풀렸음 ㄱㅅㄱㅅ