어떻게 실행의 일부분으로 ML{*...*}명령을 포함하는 문자열 ML 원본?

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

  •  21-12-2019
  •  | 
  •  

문제

이사벨은 사용자 목록 Makarius 웬젤 말한다:

그것은 또한 가능하면 주위에 전달 ML 원본의 문자열로 또는 토큰에 이사벨/ML,호출에 컴파일러습니다.는 정상의 이익을 증대 컴파일할 수도 있습니다.

가 ML 으로 문자열은 다음과 같습니다.

ML{* val source_string = "val x = 3 + 4"; *}

을 사용하고 싶 "val x = 3 + 4" 로 ML 문서 ML{*...*} 명령입니다.나는 그것을 할 수 있는 호출하여 많은/ML 외부에 다음과 같다:

ML{* 
fun polyp cmd = Isabelle_System.bash 
  ("perl -e 'print q(" ^ cmd ^ ");' | $ML_HOME/poly");
*}

ML{* polyp source_string; *}

는 대 200ms.나는 그것에 대한 것 0ms 면 내가 그것을 할 수있는 내부적으로 합니다.

업데이트 140411

Makarius 웬젤 수 있는 다른 방법으로 할 것,그러나 내가 아래로 ML_Context.eval_text 은 거의 내가 무엇을 원합니다.그것은 무슨 라인에 나와 실험.문제는 used_only_by_src1 전 세계에서 사용할 수 있습니다.할 수 없습니에 넣어 let.

내 생각하는 경우 사용 src1 에서 두 개의 서로 다른 ML{*...*} 명,거기에 몇 가지 짧은 시간에는 used_only_by_src1 수여 변경 하기 전에 그것에 의해 사용되었다.하지만,나는 이것은 모든 부분에 대해 학습하는 무국적 프로그래밍입니다.

ML{*
val src1 = "x + y" (*I would actually have a global list of sources.*)

val used_only_by_src1 = Unsynchronized.ref "";

fun two_int_arg_fun s1 s2 = let
    val s = "val x = " ^ s1 ^ "val y = " ^ s2 
             ^ "used_only_by_src1 := (Int.toString(" ^ src1 ^ "))";
    val _ = ML_Context.eval_text true Position.none s;
  in !used_only_by_src1 end;
*}

ML{*
  two_int_arg_fun;  
  two_int_arg_fun "44;" "778;"
  (*3ms*)
*}

참고 140412: 실제로,나는 필요하지 않 실행 ML 문자열입니다.나는 할 수 있는 프로그램에서 ML 같은 정상이기 때문에, ML{*...*} 액세스할 수 있는 글로벌 ML 기능,내가 쓸 수 있겠습니다.

주요 솔루션은 나이에서 전달하는 방법을 인수하는 문자열의 펄 코드,내가 여기서 노력하고 그것을 위해 ML,그래서 감사 davidg.Plus, ML_Context.execML_Context.eval_text 올 수도에서 유용한 어딘가에,그리고 학습을 충분히 그들을 사용할 수 있는 완전히 유용합니다.

의 문제가 필요로 하는 로컬 또는 글로벌 Unsynchronized.ref 는 변경되지 않는 다른 코드(또는 비 변경 가능한 타입),그러나 확실히 여기에 해답이 있습니다.

지 않았을 추구 ML_Context.exec 기 때문에 isar_syn.ML 하지 않은 모든 감각을 했는데 지금까지 아래와 같이,그래서 지금 내가"어떤 기능이 필요한가요를 포함하는 Context.generic -> Context.genericToplevel.transition -> Toplevel.transition,그리고 무엇이 사람들을 위해 할로 지금까지 나를 얻을 수 있는 반환 값의 3+4ML{*...*}?"

내가 사용하여 grep 과 Isabelle_System.bash, 고 했는데까지 무엇을 아래에서 적합한 서명에 이사벨/순수합니다.에 던져 무료로 grep 사용에 대한 유용하거나 필요한 함수에 많은/ML 기준입니다.

ML{*
Isabelle_System.bash ("grep -nr 'get_generic' $ISABELLE_HOME/src/Pure");
Isabelle_System.bash ("grep -nr 'hash' $ML_HOME/../src/Basis/*");

Config.get_generic;

(*From use at line 265 of isar_syn.ML.*)
ML_Context.exec;
ML_Context.exec (fn () => ML_Context.eval_text true Position.none "3 + 4");
  (*OUT: val it = fn: Context.generic -> Context.generic*)  

(fn (txt, pos) =>
      Toplevel.generic_theory
        (ML_Context.exec (fn () => ML_Context.eval_text true pos txt) #>
          Local_Theory.propagate_ml_env)) ("3 + 4", Position.none);
  (*OUT: val it = fn: Toplevel.transition -> Toplevel.transition*)
*}
도움이 되었습니까?

해결책

구조 ML_Context 수도 좋은 출발점입니다.예를 들어,당신의 식 실행할 수 있으므:

ML {*
  ML_Context.eval_text true Position.none "val x = 3 + 4"
*}

이것은 내부적으로 평가하는 표정 3 + 4, 고,결과이다.

기능 ML_Context.exec 할 수 있의 결과를 캡처하는 표현들을 해당 지역의 컨텍스트당신은 수도에서 보고 싶의 구현 ML 사의 명령에 src/Pure/Isar/isar_syn.ML 를 보는 방법 이러한 기능을 사용하고 있다.

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