네이버에서 검색해 보니
인자가 없는 int func(void) 와 같은 함수를 호출 하는 것을 call by name 이라고 한다는 설명이 있었습니다.
그런데 이건 네이버 지식인에서나 찾을 수 있지, google 에서는 정확하게 이 용어를 사용하거나 설명하고 있는 곳을 찾을 수가 없더군요.
이거 실재 있는 용어 맞나요? 그리고 의미는 뭔가요?
실제 있는 용어는 맞습니다만 이 방식은 C/C++에서 전혀 사용하지 않는 방법입니다. ALGOL에서 사용하는 방식입니다.
위에 kane님께서 macro와 비슷한 방식이라고 하셨는데 이 말은 맞습니다.
설명을 자세하게 하면
*매개변수 전달시 이름 자체를 전달하는 방법
*변수를 전달할 때는 call by reference와 동일하나 식을 전달할 때는 틀리게 된다
*장점 : 인터프리터 기법에서 사용하기 편하다
*단점 : 이해하기가 어렵다, 구현및 작성하기 어렵다, 부작용현상이 일어날 수 있다
가상 C코드로 설명을 하면
void main() {
int K;
int V[5];
V[3] = 6;
V[4] = 8;
K = 4;
P(V[K]);
}
P(int a) {
a = a + 1;
V[K] = 5;
K = 3;
a = a + 1;
}
이런 코드가 있을때 함수 P를 호출할때는 K값이 4이므로 V[4]가 넘어갑니다. 그리고 P함수 내부에 있는 첫번째 a는 V[4]의 값을 1 증가 시켜줍니다. 두번째 줄은 V[4]의 값을 5로 대입하고 3번째 줄에서 K가 3으로 지정이 되면 a는 V[4]를 지정하는게 아니라 V[3]을 지정하게 됩니다. 따라서 두번째 a는 V[3]의 값을 1 증가하게 됩니다.
Call By Reference 방식에서는 V[3]과 V[4]가 모두 6이지만 Call By Name방식에서는 7과 5가 됩니다.
구글/wikipedia에서 찾으니 다음 페이지가 나오네요.http
구글/wikipedia에서 찾으니 다음 페이지가 나오네요.
http://foldoc.doc.ic.ac.uk/foldoc/foldoc.cgi?call-by-name
http://en.wikipedia.org/wiki/Call-by-name
----
Let's shut up and code.
아하 :!: 네이버 지식인에 있는 답과는 완전히 다르군요. :(
아하 :!:
네이버 지식인에 있는 답과는 완전히 다르군요. :(
일단 존재한다는 것도 놀랬지만, 저런 개념으로 함수 call 을 할 수 있다는 것도 신기하네요. :shock:
들어보지 못한 다른 함수 호출 방식도 많이있네요.
정말 좋은 자료네요. 답변 감사합니다.
PS. 어쨌든 C/C++ 에는 없군요. ^^ 하하하
있다면 C/C++의 Macro가 비슷한 예겠죠.call-by-na
있다면 C/C++의 Macro가 비슷한 예겠죠.
call-by-name은 함수 작성자의 의도를 명확하게 반영하기 힘들기 때문에 별로 선호하지는 않습니다.
p.s: 그런데 lazy evaluation과의 관계는 어떻게 되는거죠? :?
Re: C/C++ 에서 Call by name ?
실제 있는 용어는 맞습니다만 이 방식은 C/C++에서 전혀 사용하지 않는 방법입니다. ALGOL에서 사용하는 방식입니다.
위에 kane님께서 macro와 비슷한 방식이라고 하셨는데 이 말은 맞습니다.
설명을 자세하게 하면
*매개변수 전달시 이름 자체를 전달하는 방법
*변수를 전달할 때는 call by reference와 동일하나 식을 전달할 때는 틀리게 된다
*장점 : 인터프리터 기법에서 사용하기 편하다
*단점 : 이해하기가 어렵다, 구현및 작성하기 어렵다, 부작용현상이 일어날 수 있다
가상 C코드로 설명을 하면
이런 코드가 있을때 함수 P를 호출할때는 K값이 4이므로 V[4]가 넘어갑니다. 그리고 P함수 내부에 있는 첫번째 a는 V[4]의 값을 1 증가 시켜줍니다. 두번째 줄은 V[4]의 값을 5로 대입하고 3번째 줄에서 K가 3으로 지정이 되면 a는 V[4]를 지정하는게 아니라 V[3]을 지정하게 됩니다. 따라서 두번째 a는 V[3]의 값을 1 증가하게 됩니다.
Call By Reference 방식에서는 V[3]과 V[4]가 모두 6이지만 Call By Name방식에서는 7과 5가 됩니다.
틀렸는데요..
틀렸어요.. 일단 소스 코드부터 틀렸어요.. 마음대로 휘갈기지 맙시다
거참...
틀렸는지 어땠는지 잘 모르겠지만, 님은 맘대로 휘갈겨서 저렇게 글 써집니까?
혹시 틀렸을 수도 있겠지만 나름 열심히 쓴 댓글로 보이는데...
틀렸다면 어디가 어떻게 틀렸는지라도 말해보던가,,,
익명이 아니라도 이 따위로 댓글 쓰실래요?
틀릴게 뭐 있나요?
분명 글 쓴 분은 '가상의' C코드라고 말씀하셨고
Call-by-name을 설명하기 위해 적은겁니다. 당연히 님이 이해하고 있는 C 문법에서는 틀린 코드죠.
그렇다고 ALGOL 언어로 적어놓으면 이해하지도 못할 분이 왜 이러시나 모르겠군요.
안틀림
ㅇㅇ
댓글 달기