SBE 4장 call-by-value, call-by-name 질문!

284 views
Skip to first unread message

네피림

unread,
Oct 22, 2010, 1:08:25 AM10/22/10
to 한국 스칼라 사용자 모임
미리 보신 분들 심심하시죠?

질문 하나 던져 봅니다.
4장에 p14에 중간에 보면

Call-by-value has the advantage that it avoids repeated evaluation of
arguments.
Call-by-name has the advantage that it avoids evaluation of arguments
when the
parameter is not used at all by the function.

이라는 문장이 나오는데, 명확하게 설명 좀 해주세요.

미리 감사 드립니다~


fupfin

unread,
Oct 22, 2010, 1:42:38 AM10/22/10
to scala...@googlegroups.com
조용히 call of duty를 설치하고... 싶어지네요.

Dongwook Lee

unread,
Oct 22, 2010, 1:45:34 AM10/22/10
to scala...@googlegroups.com
@_@;;; 네!? 질문에 답변을 좀;;; ㅋㅋ

2010년 10월 22일 오후 2:42, fupfin <fup...@gmail.com>님의 말:
--
Google 그룹스 '한국 스칼라 사용자 모임' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 scala...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 scala-korea...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/scala-korea?hl=ko에서 그룹을 방문하세요.


Outsider ..

unread,
Oct 22, 2010, 1:48:28 AM10/22/10
to scala...@googlegroups.com
동작자체는 명확(?)한 것 같은데요...
어떤 상황에서 사용해야 하는가에 대해서 고민이 좀 있다가...
지지난주에 약간 이해되는것 같았는데..
집에서 다시 보니까 잘 기억이 안나네요... ㅠㅠ

저도 궁금...


2010/10/22 Dongwook Lee <i01...@gmail.com>

Dongwook Lee

unread,
Oct 22, 2010, 1:50:26 AM10/22/10
to scala...@googlegroups.com
그럼 명확한 내용만이라도 설명을 좀... 

(덥썩! 질질~ )

2010년 10월 22일 오후 2:48, Outsider .. <outsi...@gmail.com>님의 말:

fupfin

unread,
Oct 22, 2010, 2:03:12 AM10/22/10
to scala...@googlegroups.com

> Call-by-value has the advantage that it avoids repeated evaluation of
> arguments.
> Call-by-name has the advantage that it avoids evaluation of arguments
> when the
> parameter is not used at all by the function.
>
통화별로 가치가 반복 평가의 피할 수있는 장점을 가진인수.
호출에 의해 이름은 인자의 평가를 피할 수있는 장점을 가지고
매개 변수는 함수에 의해 전혀 사용하지 않을 때.

라고 구글신이 알려주셨습니다.

지금 좀 읽어봤는데 스칼라에 이런 게 되는군요. 오호... 신기...

제가 발로 번역하면...
"값을 사용한 호출"은 인자의 중복 평가를 방지하는 장점이 있다.
"이름을 사용한 호출"은 함수가 전혀 사용하지 않는 매개변수를 평가에서 제
외하는 장점이 있다.
라네요. ;;

원상호

unread,
Oct 22, 2010, 3:32:50 AM10/22/10
to scala...@googlegroups.com
interpreter가 파라미터를 해석하는 방식이 두가지가 있다는 의미인 것 같습니다.

call-by-value는 파라미터를 값으로 미리 evaluate한다는 의미인 것 같고,
call-by-name는 파라미터를 심볼로 해석해서 값으로 evaluate하지 않는다는 의미... 가 아닐런지.

그래서 
For expressions that use only pure functions and that therefore
can be reduced with the substitution model, both schemes yield the same final
values. 즉, 함수 호출로만 이루어진 함수의 경우는 두가지가 같은 방식이 될 것이고,

Call-by-value has the advantage that it avoids repeated evaluation of arguments.
(미리 evaluate했으니깐)
Call-by-name has the advantage that it avoids evaluation of arguments when the
parameter is not used at all by the function. (사용하지 않는 arguments는 제거할 수 있으므로)

아무래도 컴파일러가 어떻게 동작하는지에 대해 잘 아는 분이 대답해 주시면 더 명확해지지 않을까 생각합니다.

2010/10/22 fupfin <fup...@gmail.com>
--
Google 그룹스 '한국 스칼라 사용자 모임' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 scala...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 scala-korea...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/scala-korea?hl=ko에서 그룹을 방문하세요.




--
-----------~~-----------------~~-----------------~~------------------~~--------------------~~--------------------~~------
* 원상호 (Won, Shawn), BPNR
* E-Mail (sh...@bpnr.co.kr, shaw...@gmail.com), Jabber ID : shaw...@gmail.com
* --- "The best way to predict the future is to invent it" - Alan Kay
-----------~~-----------------~~-----------------~~------------------~~--------------------~~--------------------~~------

원상호

unread,
Oct 22, 2010, 3:35:07 AM10/22/10
to scala...@googlegroups.com
그 아래에 call-by-value의 경우, 왜 first(1, loop)가 그 자신으로 재해석되는지를 이해하시면 될 듯 한데요...
저도 발로 이해해서 약간 자신은 없지만요... ^^

2010/10/22 원상호 <shaw...@gmail.com>

Myoungsoo Shin

unread,
Oct 22, 2010, 4:26:18 AM10/22/10
to scala...@googlegroups.com
함수를 호출할때 함수 인자를 평가하여 그 값으로 호출하면  call-by-value이고,
함수를 호출할때 함수 인자를 평가하지 않고  함수를 호출하고 함수 안에서 평가가 이루어지면  call-by-name으로 알고 있습니다. 
스칼라는 기본적으로 call-by-value이고 call-by-name을 사용하려면 파라미터의 타입에 => 을 추가해주면 되는 걸로 알고 있습니다. ( a : => Boolean ) 

함수 혹은 값을 던지고 싶고 그 평가가 함수 안에서 이루어지고 싶다면 쓸만하지 않을까 이야기 나왔는데요. 

대충 지금 막 생각해보면 

log.warn("네피림님이 "+ studyMembers.mkString(",")  + "(들)에게 밥을 사신다면 유혈사태를 벌어지지 않을 것입니다. ")
일때 위의 메세지가 함수 안에서 평가가 이루어지므로 만일 log.LEVEL = log.INFO이면 평가를 안 할수 있기때문에,
if(log.logLevel == log.INFO) { ... } 같은 구문을 매번 작성할 필요가 없지 않을까 싶은데요.

@제가 이해력이 부족해서 잘 못 이해하고 있을수 있습니다. ~_~


2010/10/22 네피림 <i01...@gmail.com>
--
Google 그룹스 '한국 스칼라 사용자 모임' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 scala...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 scala-korea...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/scala-korea?hl=ko에서 그룹을 방문하세요.

JONG-IL SEOK

unread,
Oct 22, 2010, 11:51:12 AM10/22/10
to scala...@googlegroups.com
그 날 얘기했던 내용들이 새록새록 떠오르네요.

예가 적절한 것 같습니다.

자세한 사항은 만나서...

스터디 오세요~~



2010년 10월 22일 오후 5:26, Myoungsoo Shin <anar...@gmail.com>님의 말:

Zéide Peace

unread,
Oct 23, 2010, 3:45:31 AM10/23/10
to scala...@googlegroups.com
이번 스터디에서는

어떤 이야기가 나왔었는지 궁금하네요.

2010/10/23 JONG-IL SEOK <dacl...@gmail.com>



--
Ne perdez pas courage!
Ce n`est pas encore fini.

Outsider ..

unread,
Oct 25, 2010, 8:51:28 AM10/25/10
to scala...@googlegroups.com
스터디에 못오신 분들을 위해서 위 메일에 대해서 약간 정리된 내용을 올려드립니다.
저는 올리는 역할만 할뿐입니다. ㅎ



call-by-name 을 사용하려면 => 을 추가하면 되는건 맞습니다만,
결론을 먼저 이야기하니 by-name 관련 내용을 따로 외워야 하는 느낌이 들고, 오해의 소지도 있는 것같아
참고로 말씀드리면

함수를 인자로 전달할 때, 인자 없는 함수에 대해서는 
그 표기를 ()=> 어쩌구 저쩌구 대신  ()를 빼고 표기할 수 있습니다.

맹수님이 제시한 로그 남기기를 예로 들면 
(지연 평가를 위해 함수를 인자로 전달 받음)
  1. val isDebug = true

    def debug( msg:()=> String) :Unit = {
      if ( isDebug ) {
        println(msg)
      }
    }

    해당 debug 함수를 호출하려면 다음과 같이 해야합니다.

    debug( ()=> "라스칼라코딩단" )


  2. 모양이 좀 그렇죠. 하지만 아래 처럼 쓸수도 있습니다.
    우리가 말한 => 붙이기죠 ...
    (Programming In Scala 의  by-name parameter 참고)

    val isDebug = true

    def debug( msg: => String) :Unit = {
      if ( isDebug ) {
        println(msg)
      }
    }



    호출의 모양도 약간 달라집니다. 

    scala> debug ( ()=> "라스칼라코딩단" )
    <console>:12: error: type mismatch;
     found   : () => java.lang.String
     required: String
           debug ( ()=> "라스칼라코딩단" )
                     ^

    scala> debug ( "라스칼라코딩단" )
    라스칼라코딩단

>> 말하고 싶은 요점은 by-name을 하기 위해 =>를 붙인다고 하기보다는,  
함수를 넘기면 함수를 호출하기 전까지는 실행이 되지 않으니까 지연 평가와 당연히 관련이 있고 
"인자 없는 함수의 변종 표기법 같은게 => 다" 라고 이해함 더 좋지 않을까~ 입니다. 

참고로,  => 게 by-name 호출이라고 외우면 될 것 같은 
scala.math.abs( => 10) 은 by-name으로 호출되는게 아니라 실행이 되지를 않습니다. 



2010/10/23 Zéide Peace <zeid...@gmail.com>

Park, Sungchul

unread,
Oct 25, 2010, 9:47:43 AM10/25/10
to scala...@googlegroups.com
왜 호출하는 쪽에서 call by name인지 value인지 선택하지 않고 받는 쪽에서 하나 싶었는데 그런 이유였군요.
차라리 ()를 생략하도록 했으면 더 낫지 않았을까 싶네요.

  1. def debug( msg:()=> String) :Unit
이러게 정의하면

  1. debug( ()=> "라스칼라코딩단" )
  1. debug ( "라스칼라코딩단" )
모두 되게...

2010. 10. 25. 오후 9:51 "Outsider .." <outsi...@gmail.com> 작성:

Myoungsoo Shin

unread,
Nov 9, 2010, 10:22:23 AM11/9/10
to scala...@googlegroups.com
[WIKI] 이 글타래는 제가 정리해서 위키에 추가하도록 하겠습니다. :-)


2010/10/25 Park, Sungchul <fup...@gmail.com>
Reply all
Reply to author
Forward
0 new messages