목록 & 사전 해석 식

python 의 특징 은 목록 / 사전 / 집합 등 데이터 구 조 를 제공 하 는 해석 식 입 니 다. 예 를 들 어:
[i * i for i in xrange(100) if i % 2 == 0]
0 에서 99 의 모든 짝수 를 포함 하 는 제곱 목록 을 표시 합 니 다.
larva 도 이런 문법 을 실 현 했 지만 약간 차이 가 있 습 니 다. 사실은 똑 같은 것 을 실현 해도 되 지만 마지막 에는 이렇게 하지 않 았 습 니 다.
우선, 다 중 끼 워 넣 기 for 와 if 를 하지 않 았 습 니 다. python 에 서 는 목록 해석 식 for 와 if 의 끼 워 넣 기 를 제한 하지 않 았 습 니 다. larva 는 for 만 있 거나 for.. if 만 있 을 수 있 습 니 다. 저 는 이 문법 을 너무 복잡 하 게 만 들 고 싶 지 않 습 니 다. 사실은 대부분 for 만 있 고 다 중 끼 워 넣 기 에 사용 하 는 곳 이 매우 적 습 니 다.
그 다음은 for 문장의 왼쪽 값 입 니 다. larva 는 변수 이름 이나 변수 이름 으로 구 성 된 패키지 할당 만 허용 합 니 다. (패키지 해제 가 가능 합 니 다) 이 변수 이름 이 있 는 네 임 스페이스 는 이 해석 식 에 독립 되 어 있 습 니 다. 예 를 들 어 python 에서:
a = [i for i in l]
print i
이것 은 가능 합 니 다. i 는 a 가 있 는 네 임 스페이스 로 여 겨 지기 때문에 l 마지막 에 교체 하 는 값 을 인쇄 합 니 다. 그러나 이것 은 larva 에서 허용 되 지 않 습 니 다. 목록 해석 식 의 왼쪽 값 은 임시 변수 로 여 겨 지고 해석 식 자체 가 있 는 네 임 스페이스 와 충돌 하지 않 습 니 다. 사실은 또 다른 원인 은 컴 파일 러 와 코드 전환 이 실현 하 는 편의 성 입 니 다.해석 식 의 왼쪽 값 이 하나의 네 임 스페이스 가 아니라면 컴 파일 러 가 함수 의 부분 변 수 를 검색 할 때 모든 표현 식 을 검색 해 야 합 니 다. 귀 찮 습 니 다.
코드 변환 이 실 현 될 때 네 임 스페이스 가 독립 되면 해석 식 은 함수 로 간단하게 전환 할 수 있 습 니 다.해석 식 고려 하기:
[A for B in C if D]
이 해석 식 의 실현 은:
1 계산 C
2 빈 목록 만 들 기 l
3. C 의 결 과 를 교체 하고 모든 요소 에 대해 B 에 게 할당 하 며 D 를 계산 합 니 다. D 가 성립 되면 A 를 계산 하고 결 과 는 l 에 증가 합 니 다.
4 복귀 l
이것 을 함수 f 로 쓰 면 C 의 값 을 f 에 직접 전달 할 수 있 습 니 다. 값 만 필요 하지만 A 와 D 는 f 내부 에서 이 루어 져 야 하고 B 는 컴 파일 단계 에서 해석 하여 함수 로 이 루어 진 부분 변 수 를 실현 할 수 있 습 니 다.
A 와 D 를 계산 할 때 B 의 변수 만 필요 할 수도 있 고 해석 식 자체 가 있 는 환경 을 참조 할 수도 있 습 니 다. 이런 환경 데 이 터 는 상황 에 따라 토론 합 니 다.
1 전역 변 수 는 f 를 현재 모듈 에 쓰 면 됩 니 다.
2. 해석 식 이 방법 에 나타 나 면 현재 대상 을 참조 할 수 있 습 니 다. 예 를 들 어 this 와 슈퍼 키 워드 는 1 과 마찬가지 로 f 를 클래스 내부 에 쓰 면 됩 니 다.
3 부분 변 수 는 입력 이 필요 합 니 다. 대상 언어 가 내장 함 수 를 지원 하지 않 을 수 있 기 때 문 입 니 다.
하나의 예 (larva 의 방법 에서 현재 대상 의 속성 참조 에 대해 this 를 생략 할 수 있 습 니 다. 즉, 아래 의 "a" 는 "this. a" 에 해당 합 니 다):
g = 123
m = []
class A:
    func __init__():
        .a = "hello"
    func f():
        for i in range(10):
            l = [.a + str(g) + j for j, k in m if i]
            ... //deal with l
이 예 에서 l 에 대한 할당 은 다음 과 같은 자바 코드 로 변 환 됩 니 다.
l = build_list_compr_0001(m, i);
즉 국부 변수 i 의 이때 값 은 구조 목록 해석 식 함수 로 전 달 됩 니 다. 함수 의 실현 은 다음 과 같 습 니 다.
LarObj build_list_compr_0001(LarObj obj, LarObj i)
{
    LarObj j, k;
    LarObj l = new LarObjList();
    for (LarObj iter = obj.iterator(); iter.has_next();)
    {
        LarObj[] unpack_0001 = unpack_seq(iter.next(), 2);
        j = unpack_0001[0];
        k = unpack_0001[1]; //             
        if (i.op_bool())
        {
            l.add(this.a.op_add(str(g)).op_add(j));
        }
    }
    return l;
}

이 함 수 는 class A 에 대응 하 는 출력 코드 에 구현 되 기 때문에 this 와 g 에 직접 접근 할 수 있 습 니 다. 위 에서 말 한 바 와 같이 i 는 매개 변 수 를 통 해 들 어 오고 j 는 임시 변수 로 호출 자의 네 임 스페이스 에 영향 을 주지 않 습 니 다.
물론 이 예 는 실제 변환 결과 가 아 닙 니 다. 예 를 들 어 코드 에서 변수 이름 등 이 있 습 니 다. larva 의 최종 출력 코드 는 더욱 엄격 한 규범 을 만 들 었 기 때문에 컴 파일 러 로 실제 테스트 할 수 있 습 니 다.
사전 해석 의 실현 도 유사 하 므 로 군말 하지 않 겠 다

좋은 웹페이지 즐겨찾기