1

Chicken Scheme Interpreter であるcsiによって解釈されている間にプログラム コードを更新することは可能ですか? もしそうなら、どのように?

コードの一部をインタラクティブに変更し、その変更の効果をすぐに確認できるようにします。たとえば、次のプログラムを作成したとします。

(define (loop)
   (print "Ciao")
   (rest 1)
   (loop))

(loop)

(仮定すると(rest 1)、プログラムを 1 秒間一時停止する効果があります)。

このプログラムをcsiで実行すると、文字列 "Ciao" が毎秒出力されます。文字列 "Ciao" を "else" などの別のものに変更し、プログラム コード ファイルを保存すると、csiは古いプログラム コードの解釈を続行するため、文字列 "Ciao" が引き続き表示されます。この場合、文字列 "Ciao" を "else" に置き換えて変更したコードを保存すると、csiは古いファイルではなく、変更されたファイルを調べて解釈作業を続行するようにしてください。出力として「Ciao」とそれに続く「else」を取得するため、ソース コードで「Ciao」を「else」に置き換えると、「else」が表示され始めます。

4

2 に答える 2

2

実行中のプログラムに変更のソースをチェックさせる一般的な方法はありませんが、Chicken には独自のロールを作成するのに十分な機能が用意されているようです。

(use posix)
(use srfi-18)

(define (watch-reload! file)
  (define (tsleep n)
    (thread-sleep! (seconds->time (+ n (time->seconds (current-time))))))
  (define (get-time)
    (file-modification-time file))
  (thread-start! 
   (lambda ()
     (let loop ((filetime '())) 
       (let ((newtime  (get-time)))
         (when (not (equal? filetime newtime))
           (load file))
         (tsleep 10)
         (loop newtime))))))

watch-reload!代わりに ofを使用するloadだけで、ファイルが変更されているかどうかを 10 秒ごとにチェックしてリロードします。ファイルが有効なスキームでないときに保存すると、watch-reload!再度呼び出すまで機能しなくなります。

鶏のプログラマーの方がより良い解決策を持っているかもしれません。

于 2015-02-23T19:06:46.153 に答える