Code Metaphor

Programming, Writing, Reading, Thoughts…

메서드와 연산자

오랜만에 Metaphor 관련 이야기를 하나 하려고 한다. 원래 최근까지 Metaphor의 명세상 연산자와 메서드는 구분하지 않았었고, 그래서 아래와 같은 문법을 생각하고 있었다.

a b # attribute “b” of “a”
a b() # call attribute “b” of “a”, arguments: ()
f # “f”
f() # call “f” function-like object, arguments: ()
a +(b) # call attribute “+” of “a”
+(a, b) # call "+" function-like object, arguments: (a, b)

많은 사람들에게 +(1, 2, 3)이나 1 +(2, 3), 1 +(2) +(3)과 같은 구문은 어떠냐고 물어본 결과, 대답은 대부분 “이건 LISP도 아니고 ALGOL도 아니여~”였고, 이것이 나의 최근 고민이였다. 애초에 속성 접근을 일반적으로 사용하는 점(.) 대신 공백 문자로 한 것도 메서드와 연산자를 일원화시키기 위해서 아니였던가? 1.+(2, 3)이나 1.+(1).+(3)은 더 웃기니까.

그러다 최근 한 가지 해결 방법이 떠올랐다. 호출 구문을 세 가지로 제공하는 것이 그것이다. 첫번째 방법은 Python이나 JavaScript처럼 함수 객체 뒤에 괄호—()—를 붙이는 방법. 다만 더이상 공백 문자를 속성 접근 연산자로 사용하지 않고, 그냥 점(.)을 사용하기로 했다.

a.b # attribute “b” of “a”
a.b() # call attribute “b” of “a”, arugments: ()
f # “f”
f(arg, arg) # call “f” function-like object, arguments: (arg, arg)

다른 하나는 함수 객체 뒤에 콜론—:—을 붙이는 것. 이 방법은 이전에도 역시 있었다. 첫번째 방법과의 차이점이라면, 키워드 인자를 사용하지 못한다는 점. 인자는 순서대로 전달할 수밖에 없다. 음, 그리고… 인자는 무조건 하나 이상이여야 한다. 인자 없이 호출하려면 위 방법을 사용할 수밖에 없다.

a.b # attribute “b” of “a”
a.b: arg # call attribute “b” of “a”, arguments: (arg)
f # “f”
f: arg, arg # call “f” function-like object, arugments: (arg, arg)

마지막 방법이 내가 새로 떠올린 바로 그 방법이다. 어떤 객체의 속성을 점(.) 대신 공백문자로 접근해서 호출하는 방법이다. 일단 보자.

a b arg # call attribute “b” of “a”, arguments: (arg)

위 두 방법과 달리, 속성 접근과 호출이 하나로 합쳐진 문법이다. 따라서, 식별자 하나만 있을 때 그것을 호출하기 위해서는 사용할 수 없다. f arg는 적법하지 못한 문법이다. 또한, 반드시 인자는 하나여야 한다. 없어도 안되고, 둘 이상이어도 안된다. 이 제한적인 호출 구문을 이용하면 다른 언어에 있는 산술 연산자나 and와 같은 논리 연산자를 흉내낼 수 있다.

1 + 2 # call attribute “+” of “1”, arguments: (2)
True and False # call attribute “and” of “True”, arguments: (False)
a b c d e # call attribute “d” of expression “a b c”, arguments: (e)

아, 이 세 호출 구문은 해석 우선순위대로 쓴 것이다. 마지막 방식은 해석 우선순위가 가장 낮기 때문에 아래와 같이 조금 복잡한 표현식도 별 탈 없이 작성할 수 있다.

a.hasAttribute?(`name) and (b - 2).odd? then { ... }

풀어서 쓰면?

a.hasAttribute?(`name).and(b.-(2).odd?).then({ ... })

This entry was posted on May 12, 2007 at 9:49 PM. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

4 Responses to “메서드와 연산자”

  1. Code Metaphor — Metaphor에서 데코레이터 Says:

    […] 않지만, 일반 호출 구문으로도 비슷한 가독성을 얻을 수 있을 것 같다. 이전 포스트에서 설명했던 두번째 호출 구문을 사용하면 아래와 같이 작성할 수 […]

  2. Heungsub Says:

    굉장히 괜찮은 방법 같습니다. 제한도 적절하고요. 하지만 예외가 없을지는 잘 모르겠네요.

  3. Code Metaphor — 키워드 인자 (keyword arguments) Says:

    […] 2007년 5월 16일 현재 Metaphor의 호출 구문은 크게 바뀌었다. 자세한 것은 메서드와 연산자라는 포스팅을 참고하면 […]

  4. Code Metaphor — Metaphor에서 팩토리얼 구하기 Says:

    […] 2007년 3월 5일 추가: .을 사용하기로 결정했다. 2007년 5월 16일 추가: Metaphor의 호출 구문이 대대적으로 바뀌면서, .을 사용하지 못하게 되어 다시 self로 […]

Powered by WordPress. Styled by Hong, MinHee. XML Feed, Comments XML Feed.