openlang

같은 parseServices인데 잘못된 줄은 빌드할 때만 깨지나요?

내장 테이블은 절대 안 바뀌니까 auto를 enum으로 바꿨는데, 맞죠? 이제 smtp 25(proto 없음)가 dub build를 깨뜨려요. 에러는 stderr writeln not usable at compile time 으로 끝나고요. ldc2 쓰는 ci.sh도 services.txt를 못 찾아요. 관련 있을까요?

enum builtin = parseServices(import("services.txt"));
dns 53 udp
smtp 25
ldc2 -O source/app.d -of=svcmap

dub.sdl에는 stringImportPaths "."가 있어요.

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    네, 절대 안 바뀌는 테이블이면 enum 쓰는 게 맞아요. 근데 enum은 ctfe를 강제해서, parseServices의 모든 경로가 컴파일 타임에 실행될 수 있어야 해요. smtp 25 줄이 에러 분기로 들어가는데, 거기서 stderr.writeln은 실행할 수 없어요.

    대신 Exception을 throw하거나 assert(0, msg)를 쓰세요. 컴파일러가 그 메시지를 빌드 에러로 출력해 주니까 원하는 동작일 거예요.

    ci.sh는 별개 문제예요. import()를 쓰려면 ldc2에 -J.가 필요해요. dub는 stringImportPaths에서 그걸 넘겨주는데, 그냥 ldc2는 안 그래요.

    저는 parse proc를 이런 식으로 throw만 쓰고 io 없이 만들어 둬요. 그러면 ctfe가 훨씬 편해요.

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 같은 Int인데 타깃이 둘이면 답도 둘이에요

    같은 소스, 같은 JSON 파일인데 타깃마다 결과가 달라요. 이건 좋지 않아요. cohort_join은 우리 트래킹 시스템에서 내보낸 JSON을 읽어서 참가자를 id 기준으로 인덱싱해요. id는 타임스탬프에 카운터를 붙여서…

    답글 0최근 활동 gleam
  2. pure 호스트 함수가 캐시되고, 인자에 쓴 값이 그냥 사라져요

    주말 프로젝트로 D로 작성한 호스트 함수를 이름으로 등록해서 쓰는 장난감 표현식 평가기를 만들었어요. registry에 memo 캐시도 넣었어요 (꽤 뿌듯해서 일주일 내내 자랑하고 다녔어요). 규칙은 이래요. 함수가 pure…

    답글 2최근 활동 d
  3. CPS 합계가 Debug에서는 스택 오버플로를 일으키고, Release에서는 두 번째 함수만 일으켜요

    안녕하세요 여러분, 연습 삼아 continuation-passing style을 공부하고 있고, 데이터 작업용 작은 센서 도구를 쓰고 있어요. loadReadings는 리스트를 생성하고, 아직 못 만든 CSV 로더를 대신하고…

    답글 2최근 활동 fsharp