C/C++ 에서 Call by name ?

ssehoony의 이미지

call by name 이라는 용어를 우연히 들었는데

네이버에서 검색해 보니
인자가 없는 int func(void) 와 같은 함수를 호출 하는 것을 call by name 이라고 한다는 설명이 있었습니다.

그런데 이건 네이버 지식인에서나 찾을 수 있지, google 에서는 정확하게 이 용어를 사용하거나 설명하고 있는 곳을 찾을 수가 없더군요.

이거 실재 있는 용어 맞나요? 그리고 의미는 뭔가요?

sangwoo의 이미지

구글/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.

ssehoony의 이미지

아하 :!:

네이버 지식인에 있는 답과는 완전히 다르군요. :(
일단 존재한다는 것도 놀랬지만, 저런 개념으로 함수 call 을 할 수 있다는 것도 신기하네요. :shock:

들어보지 못한 다른 함수 호출 방식도 많이있네요.
정말 좋은 자료네요. 답변 감사합니다.

PS. 어쨌든 C/C++ 에는 없군요. ^^ 하하하

kane의 이미지

있다면 C/C++의 Macro가 비슷한 예겠죠.

call-by-name은 함수 작성자의 의도를 명확하게 반영하기 힘들기 때문에 별로 선호하지는 않습니다.

p.s: 그런데 lazy evaluation과의 관계는 어떻게 되는거죠? :?

세이군의 이미지

ssehoony wrote:
call by name 이라는 용어를 우연히 들었는데

네이버에서 검색해 보니
인자가 없는 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가 됩니다.
익명 사용자의 이미지

틀렸어요.. 일단 소스 코드부터 틀렸어요.. 마음대로 휘갈기지 맙시다

upriser의 이미지

틀렸는지 어땠는지 잘 모르겠지만, 님은 맘대로 휘갈겨서 저렇게 글 써집니까?

혹시 틀렸을 수도 있겠지만 나름 열심히 쓴 댓글로 보이는데...

틀렸다면 어디가 어떻게 틀렸는지라도 말해보던가,,,

익명이 아니라도 이 따위로 댓글 쓰실래요?

익명 사용자의 이미지

분명 글 쓴 분은 '가상의' C코드라고 말씀하셨고
Call-by-name을 설명하기 위해 적은겁니다. 당연히 님이 이해하고 있는 C 문법에서는 틀린 코드죠.
그렇다고 ALGOL 언어로 적어놓으면 이해하지도 못할 분이 왜 이러시나 모르겠군요.

병신인가의 이미지

ㅇㅇ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.