저는 함수가 퍼스트 클래스 객체 인 새로운 클래스 기반의 동적 타입 프로그래밍 언어에 대해 연구하고 있습니다. 클래스 내에서 정의 된 함수 (메서드라고도 함)는 자체을 첫 번째 매개 변수로 전달하고 전역 적으로 정의 된 함수는 자체 매개 변수가 필요하지 않습니다. 같은 코드에서 자기가 전달되어야하는지 컴파일러가 어떻게 결정할 수 있습니까?
: 필요 자기가 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를 가리 킵니다.
Java에서 호출 유형을 결정하는 것은 메소드 구문 만이 아닙니다. 'abc (1234)'와 같은 표현식을 가지고 있다면'c (1234)'는'ab' 형으로 선언 된'static' 메쏘드 나'b 필드에있는 객체에서 호출 된 인스턴스 메쏘드를 호출 할 수 있습니다 ''a' 타입의'static' 필드이거나'a' 변수에서 발견 된 객체의 인스턴스 필드가 될 수 있습니다. 요점은 정적 유형 시스템으로 컴파일 타임에 변수, 유형 및 메소드를 찾아보고 결정할 수 있습니다. – Holger
@Holger 필자는 "컴파일러가 정적 또는 가상 메서드인지 여부를 알기 위해 노력했지만"충분히 명확하지 않았다고 생각합니다. 또한, https://gist.github.com/Storyyeller/fd97cccc02287dd40e43 – Antimony