2015-12-13 7 views
6

一般質問:起動 `ラケットスクリプトでracket`

は、私が実行しているラケットスクリプト内から現在のracket実行ファイルを起動することはできますか?

(find-executable-path "racket")が現在使用しているRacket実行ファイルへのパスを返さない場合、基本的には(system "racket ...")の代わりをしたいと思います。

コンテキスト:

私が本当にしたいことは、いくつかの表現をコンパイルしようとすると、彼らはコンパイルエラーを上げることを主張することです。これは単体テスト用です。

+1

私はTyped Racketがこの問題を解決していることを知っていますが、私は解決策を理解していません。 (ここで「dr」とは何ですか?) –

+0

ベンを過ぎたら、あなたは持っているでしょう。 'find-console-bin-dir'と' find-exe'が好きです。 –

答えて

5

実行可能ファイルの外側にステップする必要はないと思います。これを試してみてください:

#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)))))) 

私はラケットは、規律の方法でプログラムを実行するコンパイラを提供する能力に単独でクリーンであることを言うとき、私は正しいと思います。

+0

FWIW、リーフの答えは私のレベルよりも高く、おそらくあなたが望むものに近いです! –

4

ラケット式をコンパイルするだけの目的は、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))))) 

最後に、あなたはジョンのソリューションを使用することができます。だからあなたのコードは次のようなものに終わるだろう。

+0

私の 'tests'が別々のファイルにある場合はどうなりますか?ファイル名やポートで 'compile'を呼び出せますか? –

+0

私はその答えを更新しました。 –

2

小テストの場合は、syntax/macro-testingライブラリのconvert-compile-time-errorを使用することもできます。これは、評価時に実行時エラーを発生させる式にコンパイル時エラーを発生させる式を返します。この式では、ローカルバインディングを含むモジュールで発生する環境を使用します。あなたは名前空間とevalを試す必要はありません。

(check-exn #rx"bad syntax" 
      (lambda() (convert-compile-time-error (lambda)))) 

(同じページにある)convert-syntax-errorもあります。

関連する問題