は、私が実行しているラケットスクリプト内から現在のracket
実行ファイルを起動することはできますか?
(find-executable-path "racket")
が現在使用しているRacket実行ファイルへのパスを返さない場合、基本的には(system "racket ...")
の代わりをしたいと思います。
コンテキスト:
私が本当にしたいことは、いくつかの表現をコンパイルしようとすると、彼らはコンパイルエラーを上げることを主張することです。これは単体テスト用です。
は、私が実行しているラケットスクリプト内から現在のracket
実行ファイルを起動することはできますか?
(find-executable-path "racket")
が現在使用しているRacket実行ファイルへのパスを返さない場合、基本的には(system "racket ...")
の代わりをしたいと思います。
コンテキスト:
私が本当にしたいことは、いくつかの表現をコンパイルしようとすると、彼らはコンパイルエラーを上げることを主張することです。これは単体テスト用です。
実行可能ファイルの外側にステップする必要はないと思います。これを試してみてください:
#lang racket
(require syntax/modread)
;; define a namespace anchor to attach a namespace to:
(define-namespace-anchor anchor)
;; define a namespace for expansion:
(define target-namespace (namespace-anchor->namespace anchor))
(define program-to-compile
"#lang racket
(+ 3 4)")
;; go ahead and expand
(with-module-reading-parameterization
(λ()
(parameterize ([current-namespace target-namespace])
(expand
(read-syntax
"bogus-filename"
(open-input-string program-to-compile))))))
私はラケットは、規律の方法でプログラムを実行するコンパイラを提供する能力に単独でクリーンであることを言うとき、私は正しいと思います。
FWIW、リーフの答えは私のレベルよりも高く、おそらくあなたが望むものに近いです! –
ラケット式をコンパイルするだけの目的は、compile
またはcompile-syntax
のいずれかを使用して行うことができます。サンプルファイルは次のようになります。
#lang racket
(require rackunit)
(define tests
(list #'(+ 1 "3")
#'(void void)
#'(string-append 4)))
(for/list ([t (in-list test)])
(check-exn exn:fail?
(lambda() (compile t))))
exn:fail?
は、あなたが探しているされているものは例外ところ。
さらに、テストを実行する共通の構文コンテキストがある場合は、#`
#,
を使用できます。文字列にファイルを変換するためにfile->string
を使用している間、あなたのコードがコンピュータに格納されている場合
#lang racket
(require rackunit)
(define tests
(list #'(+ 1 "3")
#'(void void)
#'(string-append 4)))
(for/list ([t (in-list test)])
(check-exn exn:fail?
(lambda() (compile #`(module anonymous racket
#,t)))))
最後に、あなたはジョンのソリューションを使用することができます。だからあなたのコードは次のようなものに終わるだろう。
私の 'tests'が別々のファイルにある場合はどうなりますか?ファイル名やポートで 'compile'を呼び出せますか? –
私はその答えを更新しました。 –
小テストの場合は、syntax/macro-testing
ライブラリのconvert-compile-time-error
を使用することもできます。これは、評価時に実行時エラーを発生させる式にコンパイル時エラーを発生させる式を返します。この式では、ローカルバインディングを含むモジュールで発生する環境を使用します。あなたは名前空間とeval
を試す必要はありません。
(check-exn #rx"bad syntax"
(lambda() (convert-compile-time-error (lambda))))
(同じページにある)convert-syntax-error
もあります。
私はTyped Racketがこの問題を解決していることを知っていますが、私は解決策を理解していません。 (ここで「dr」とは何ですか?) –
ベンを過ぎたら、あなたは持っているでしょう。 'find-console-bin-dir'と' find-exe'が好きです。 –