메서드와 연산자
오랜만에 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({ ... })

May 14th, 2007 at 2:18 AM
[…] 않지만, 일반 호출 구문으로도 비슷한 가독성을 얻을 수 있을 것 같다. 이전 포스트에서 설명했던 두번째 호출 구문을 사용하면 아래와 같이 작성할 수 […]
May 14th, 2007 at 11:15 AM
굉장히 괜찮은 방법 같습니다. 제한도 적절하고요. 하지만 예외가 없을지는 잘 모르겠네요.
May 16th, 2007 at 4:01 PM
[…] 2007년 5월 16일 현재 Metaphor의 호출 구문은 크게 바뀌었다. 자세한 것은 메서드와 연산자라는 포스팅을 참고하면 […]
May 16th, 2007 at 4:05 PM
[…] 2007년 3월 5일 추가: .을 사용하기로 결정했다. 2007년 5월 16일 추가: Metaphor의 호출 구문이 대대적으로 바뀌면서, .을 사용하지 못하게 되어 다시 self로 […]