사람이 읽을 수있는 F# 따옴표에 대한 내장 기능이 있습니까?

StackOverflow https://stackoverflow.com/questions/1448961

  •  11-09-2019
  •  | 
  •  

문제

인용 할 때

<@ 1 + 1 @>

나는 "1 + 1"을 원한다

대신에

"Call (None, Int32 op_Addition[Int32,Int32,Int32](Int32, Int32), [Value (1), Value (1)])"

올바른 솔루션이 없습니다

다른 팁

당신은 직접 써야합니다. 참조 F# 인용문 시각화 인용문 변환을위한 가이드로 코드 추상 구문 트리.

더 큰 오픈 소스 프로젝트의 일환으로 견적 디 컴파일러를 구현했습니다. 고려하지 않습니다. 많은 간단한 F# 인용 된 표현식을 단일 라인 비 라이트 구문 문자열로 소집 할 수 있습니다 (디 컴파일러 기능 목록은 프로젝트 홈페이지 참조). 예를 들어,

> decompile <@ (11 + 3) / 2 = String.length ("hello world".Substring(4, 5)) @>;;
val it : string =
  "(11 + 3) / 2 = String.length ("hello world".Substring(4, 5))"

@Kurt Schelfthout은 F# 인용문을 인간 읽을 수있는 형태로 디 컴파일 할 때 직면 한 많은 도전에 대해 정확합니다. 하지만 지금까지의 일에서 나는 그것이 ~이다 생성 할 수있는 인용 디 컴파일러를 작성할 수 있습니다 옳은 F# 코드. 예를 들어, 인용되지 않은 디 컴파일러와 같은 성냥 표현 및 계산 표현식을 취하십시오. ~할 수 있다 다음 간단한 경우에 올바른 F# 코드를 생성하십시오.

> decompile <@ match true with | true -> "hi" | _ -> "bye"  @>;;
val it : string =
  "let matchValue = true in if matchValue then "hi" else "bye""

> decompile <@ seq {yield 1; yield 2}  @>;;
val it : string =
  "seq (Seq.delay (fun unitVar -> Seq.append (Seq.singleton 1) (Seq.delay (fun unitVar -> Seq.singleton 2))))"

Infix 및 Prefix 연산자는 너무 어렵지 않지만 (첫 번째 예에서 볼 수 있듯이) 새 라인 및 압입과 같은 소스 구조는 흥미로운 주제입니다 (정말 어렵지는 않지만 생각합니다). 그러나 단일 라인이 아닌 구문은 인용문의 요구 사항에 충분합니다.

아무것도 없으며, 매우 간단한 경우를 제외하고는 그렇게 쉽지 않습니다. 예를 들어 주요 문제 중 하나는 매치 구성입니다. 그것은 IF 및 스위치 명세서의 전체 무리에 대한 구문 설탕입니다 (일치하는 인용문을 인쇄하면 볼 수 있습니다). 그 큰 중 하나는 계산 표현이지만 처음에는 그 표현을 건너 뛸 수 있다고 생각합니다.

그런 다음 파이프 연산자가 새 라인을 시작하고 새로운 라인, 들여 쓰기, 디픽스, 접두사, (: :) 연산자 등과 같은 특별한 경우를 시작하게하는 컨벤션과 함께 해결해야 할 모호성의 토끼 구멍이 있습니다. 앞으로.

대체로, 가능하지만 사소한 것은 아닙니다. 일종의 디 컴파일과 같은 것입니다.

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