2017-11-13 32 views
0

でREPLを構築するための無限ループを作成します。私は完全なLispでのnoob(や方言だから、しかしそれは私が使用してCommon LispではREPLを作成することができますどのように、美しい私を打つスキーム

(loop (print (eval (read)))) 

を)、私は残念ながら、loop機能がないため、Schemeで同じことを達成できませんでした。 そこで質問です((loop (print 'foo))

と呼ばれる場合でも、私は

(define (loop x) x (loop x)) 

としてそれを実装しようとしたしかし、それは何もしていないようです:スキームでの無限ループを実装する方法

答えて

1
(define (loop x) 
    x 
    (loop x)) 

これは、呼び出し時に無限ループですが、消したり、評価したり、印刷したりしません。引数xを受け取り、それを評価してから、同じ引数を指定して呼び出しを繰り返してから繰り返します。

あなたはこのような何かしたいREPLについては

(define (repl) 
    (display (eval (read))) ; for side effect of printing only 
    (repl)) 

通常REPLを終了する方法があります:

(define (repl) 
    (let ((in (read))) 
    (when (not (eq? in 'exit)) 
     (print (eval in)) 
     (repl)))) 
+0

私implementionの試みだけ '自体をloop'に向け、私ましたCLのように '(loop(print(eval(read)))')を使うことができます。私はまだそれが動作しない理由を理解していない。おお、再帰 '(repl)'は私を非常によく似ています... –