문제

가장 멋진 것은 무엇입니까? 다소 실용적입니다 D 프로그래밍 언어로 수행 한 적이 있거나 본 해킹? 다소 실용적인 것은 예를 들어 컴파일 타임 Raytracer를 배제하는 것을 의미합니다.

도움이 되었습니까?

해결책

가장 멋진 시원한 관점에서, Kirk McDonald 's를 말해야 할 것입니다. PYD (및 기타 유사한 바인딩) 이들은 복잡한 코드 생성뿐만 아니라 많은 다양한 유형을 감지하고 처리하는 데 큰 양의 작업을 수행했습니다.

즉, PYD는이기 때문에 승리합니다 기술적으로 템플릿이 아닌 CTFE를 사용합니다.

보다 개인적인 메모로 D 템플릿은 광산의 연구 프로젝트에서 광범위한 사용을 받았습니다. 모듈이 자신의 개인 데이터 유형을 정의 할 수있는 시뮬레이션 프레임 워크입니다. 프레임 워크에 새 사용자 유형을 노출하려면 유형에 대한 XML 파서와 관련 네트워크 직렬화/사제 코드를 생성하는 단일 코드 라인이 필요합니다.

다른 팁

임의의 정밀 유형 컴파일 시간에 ASM 코드를 생성합니다 (컴파일러 이전)

스크랩플 도구의 DPARSE는 템플릿 파서 생성기입니다. 그러나 LDC는 작동하는 컴파일 타임 GC를 가진 유일한 D 컴파일러입니다 (그러나 그럼에도 불구하고 홀수로 무작위 충돌이 발생합니다). 나는 그것을 조금 가지고 놀았으며 구성 파일 구문 분석 및 물건과 같은 흥미로운 일을 할 수 있지만 컴파일 시간 GC가 완전히 실행될 때까지 큰 일을 할 수 없습니다.

그만큼 D/Objective-C 브리지 템플릿을 사용하여 D에서 코코아 물체를 조작 할 수 있습니다.

제가 가장 좋아하는 것은 Elemtype 및 keytype의 도구입니다.베이스 :

template ElemType(T) {
  alias typeof((function() {
    foreach (elem; Init!(T)) return elem; assert(false);
  })()) ElemType;
}

template KeyType(T) {
  alias typeof((function() {
    foreach (key, elem; Init!(T)) return key; assert(false);
  })()) KeyType;
}

유나이티드 유형 템플릿 구조 (단위 오류를 허용하지 않습니다.)

시간 스트링 해싱을 컴파일합니다. 이것을 사용하여 코드에서 임베디드 문자열을 난독 화 할 수 있습니다. "해시"를 검색하십시오. 그 페이지의 다른 흥미로운 샘플도 꽤 많이 있습니다.

한 가지 예는 다음과 같습니다 비트 필드 사용자 지정 레이아웃에서 시작하여 비트 필드 조작 코드를 생성하는 D의 표준 라이브러리 시설.

그만큼 튜플 시설 또 다른 예입니다. 사용자 제공 유형과 선택적 이름을 기반으로 튜플을 생성합니다. 이름이 지정된 필드를 주입하기 위해 생성 umph가 많지 않지만 예시적인 예라고 생각합니다.

Lambert의 익스플로잇을 알지 못하고 표준 라이브러리에 메모 라이즈를 추가했습니다. 여기 문서의 경우 여기 코드 및 여기 관련 뉴스 그룹 토론.

내가 일한 또 다른 시설은 통합 또는 실제 값 기능을 테이블화하는 고차 기능입니다 (예 : 빠른 지수를 제공 함). 아직 출시 될 준비가되지 않았습니다.

컴파일 중에 객체 생성이 허용되면 컴파일 중에 모든 오토마타 생성을 수행하는 정규식 엔진을 쉽게 만들 수 있습니다.

내가 물었을 때 이것은 존재하지 않았기 때문에 내 질문에 대답 할 것입니다. 나는 템플릿과 컴파일 타임 내성을 사용하여 컴파일러 내에서이를 수행하는 대신 정확한 힙 스캔을 허용하기 위해 임의로 복잡한 사용자 정의 유형에 대한 포인터 오프셋 정보를 생성하는 쓰레기 수집기에 패치를 썼습니다.

헤더 인 Memoize () 함수를 작성했습니다 (코드는 여기에 붙여 넣기에 약간 길다).

Auto Memoize (tfunc) (tfunc func);

그것이하는 일, 당신은 함수의 주소를 제공하고, 원래 함수의 반환 값을 캐시하는 강하게 유형 된 대의원 (원래 함수와 동일한 서명 및 반환 유형)을 반환하여 동일한 매개 변수로 두 번 호출합니다. 기본 기능 만 한 번만 호출합니다. 예를 들어, 여기에는 지수 적이 지 않고 선형으로 실행되는 피보나치 시퀀스의 메모 화 된 "재귀 적"정의가 있습니다.

uint fib (uint n) {return n> 0? n> 1? Memoize (& fib) (n -1) + memoize (& fib) (n -2) : 1 : 0; }

fib (1000);


편집 : 내가 게시 한 이전 코드는 다소 끔찍했습니다. 이 버전은 훨씬 더 우아합니다.

Mixins는 a에서 간단한 구조를 읽고 씁니다 개울 물체:

template TStructReader() {
        private alias typeof(*this) T;
        static T opCall(Stream stream) {
                assert(stream.readable);
                T ret; stream.readExact(&ret, T.sizeof);
                return ret;
        }
}

template TStructWriter() {
        private alias typeof(*this) T;
        void write(Stream stream) {
                assert(stream.writeable);
                stream.writeExact(this, T.sizeof);
        }
}

다음과 같이 사용하십시오.

align (1) struct MyStruct {
        ... definitions here ...
        mixin TStructReader;
        mixin TStructWriter;
}

auto ms = MyStruct(stream);
ms.write(stream);

루드 또한 Metaprogramming을 광범위하게 사용하여 LUA와 완벽하게 상호 작용합니다. 단일 명령으로 전체 클래스를 등록 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top