1

저는 함수가 퍼스트 클래스 객체 인 새로운 클래스 기반의 동적 타입 프로그래밍 언어에 대해 연구하고 있습니다. 클래스 내에서 정의 된 함수 (메서드라고도 함)는 자체을 첫 번째 매개 변수로 전달하고 전역 적으로 정의 된 함수는 자체 매개 변수가 필요하지 않습니다. 같은 코드에서 자기가 전달되어야하는지 컴파일러가 어떻게 결정할 수 있습니까?

: 필요 자기가 P1 (1234) 여부에 첫 번째 인수로 전달 될 경우

func foo(a) { 
    return a*2; 
} 

class c3 { 
    var p1 = 555; 
    func init() { 
     p1 = foo; 
    } 
} 

class c2 { 
    var p1 = 333; 
    func init() { 
     p1 = c3(); 
    } 
} 

class c1 { 
    var p1 = 111; 
    func init() { 
     p1 = c2(); 
    } 
} 

func main() { 
    return c1().p1.p1.p1(1234); 
} 

어떻게 컴파일러를 결정할 수 있습니다? 이 경우 p1은 자체 매개 변수가 필요하지 않은 전역 함수 인 foo를 가리 킵니다.

답변

0

파이썬에서는 런타임시 디스크립터 프로토콜에 의해 처리됩니다.

Java는 with()를 사용하여 객체를 호출 할 수 없도록함으로써 이것을 처리합니다. 모든 것이 메소드 구문과 함께 호출되며, 컴파일러는 메소드가 정적 메소드인지 가상 메소드인지를 알 수 있습니다. Java에서 함수 객체를 사용하려면 객체 (foo() 대신 foo.call())에서 특정 메소드를 호출해야합니다.

저는 C++이 유형 시스템을 통해이를 처리한다고 생각합니다. 이름이 메서드 인 경우 메서드 호출입니다. 정적 메서드 인 경우 정적 메서드 호출입니다. 그렇지 않으면 필드의() 연산자에 액세스하고 있습니다.

+0

Java에서 호출 유형을 결정하는 것은 메소드 구문 만이 아닙니다. 'abc (1234)'와 같은 표현식을 가지고 있다면'c (1234)'는'ab' 형으로 선언 된'static' 메쏘드 나'b 필드에있는 객체에서 호출 된 인스턴스 메쏘드를 호출 할 수 있습니다 ''a' 타입의'static' 필드이거나'a' 변수에서 발견 된 객체의 인스턴스 필드가 될 수 있습니다. 요점은 정적 유형 시스템으로 컴파일 타임에 변수, 유형 및 메소드를 찾아보고 결정할 수 있습니다. – Holger

+0

@Holger 필자는 "컴파일러가 정적 또는 가상 메서드인지 여부를 알기 위해 노력했지만"충분히 명확하지 않았다고 생각합니다. 또한, https://gist.github.com/Storyyeller/fd97cccc02287dd40e43 – Antimony

0

단순 : c3.p1은 멤버 변수이며 c3의 메서드는 아닙니다. 따라서 c3.p1으로 전화하면 c3의 모든 인스턴스를 가리키는 self이 표시되지 않습니다.

당신은하지만, 바인딩 방법을 지원 할 수 있습니다 :

이 경우
class c3 { 
    var p1 = 555; 
    func bar() { print "Hello, world"; } 
    func init() { 
     p1 = self.bar; // NOT self.bar() 
    } 
} 

, 컴파일러는 여전히 c3.p1()c3self 참조를 전달하지 않을하지만 self 이미 이후 그 호출 사이트에서 필요는 없습니다 self.barp1에게 배정했을 때 바운드.

관련 문제