2012-08-08 20 views
9

Scala REPL cihazını durdurmak/kapatmak için bir kısayol tuşu var mı?Hotkey, REPL'yi durdurmak için?

Örnek: SBT'den Scala REPL'yi console komutunu kullanarak başlatıyorum, daha sonra sonsuz bir döngü gibi aptalca bir şey yapın ve kabukları kapatmadan REPL'yi sonlandırmak istiyorum. Ctrl + C, Ctrl + D (tüm çalışmıyor) veya Ctrl + Z gibi bir şey.

Güncelleme: OS: Windows 7 64 Bit.

Ctrl + D + Ben

while(true) prinln("test") 

gibi sonsuz bir döngü içinde olduğum zaman repl çıkmak DEĞİLDİR D bir yolu var mı SBT ve REPL ancak Ctrl var Kabuğu kapatmadan bir kısayol tuşu ile sonsuz döngüden çıkmak? Veya bu mümkün değildir, çünkü REPL döngüden geçene kadar kısayollara tepki göstermeyecektir (tabii ki bu durumda olmaz).

+0

hm hangi işletim sistemini kullanıyorsunuz? Ctrl + c benim için hile yapmak gibi görünüyor (MacOS 10.6 altında) –

+0

sbt den başlatıyor, çünkü 'konsol' diyorsun? –

+0

@MateuszDymczyk Oh, görüyorum ki, bu işletim sistemine özel bir sorun gibi görünüyor. Windows 7 64 Bit Edition kullanıyorum. Ctrl + C benim için çalışmıyor. –

cevap

2

Aşağıdakiler Scala 2.10.0-M6 ile çalışır, ancak 2.9.2'de muhtemelen REPL güç modunda :wrap'u kullanarak benzer bir şey elde edebilirsiniz.

REPL (eğer aksi takdirde sadece Scala'nın sınıf yolunda ReplUtil sınıf koymak olabilir) genelliği kaybetmeden sbt console — aracılığıyla sbt başlatıldığı varsayın. Aşağıdaki sınıfın sınıf yolunda olduğunu varsayalım, ör. kaynak src/main/scala/ReplUtil.scala olan ve konu ile ilgili

$ sbt console 
... 
Welcome to Scala version 2.10.0-M6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_33). 
... 
scala> import ReplUtil.panic 
import ReplUtil.panic 

scala> :power 
** Power User mode enabled - BEEP WHIR GYVE ** 
... 

scala> power.intp.setExecutionWrapper("ReplUtil.spawn") 

scala> 2+2 
res1: Int = 4 

scala> Thread.sleep(6000); 33 
<ongoing calculation> 

scala> <calculation done> 
res2: Int = 33 

scala> while(true) { Thread.sleep(2000); println("Zzz")} 
Zzz 
Zzz 
<ongoing calculation> 
scala> panic 

scala> [error] (pool-5-thread-1) java.lang.ExceptionInInitializerError 
java.lang.ExceptionInInitializerError 
... 
Caused by: java.lang.InterruptedException: sleep interrupted 
... 
+0

A +0 iken Q nasıl +6 olabilir? Her neyse, şöyle bir sonuç çıkardı: wrap, REPL, "zamanlanmış", "kesilmez" vb. –

0

yararlı bir vites değiştirme olmayan çıkmak için bağlayıcı + D anahtar:

import java.util.concurrent.{Executors, ExecutorService, TimeoutException, TimeUnit} 
import concurrent._ 

object ReplUtil { 
    @volatile private var exec: ExecutorService = _ 
    @volatile private var threads = Set.empty[ Thread ] 
    private def freshPool() { exec = Executors.newCachedThreadPool() } 
    freshPool() 

    private implicit def context = ExecutionContext.fromExecutorService(exec) 

    def panic() { 
    (new Thread { 
     override def run() { 
     try { 
      exec.shutdownNow() 
      exec.awaitTermination(1, TimeUnit.SECONDS) 
     } finally { 
      val th = threads 
      threads = Set.empty 
      th.foreach(_.stop) 
      freshPool() 
     } 
     } 
    }).start() 
    }  

    def spawn[T](t: => T) = { 
    var futPrint = false 
    val fut = future { 
     val th = Thread.currentThread() 
     threads += th 
     val res = try { t } finally { threads -= th } 
     if(futPrint) println("<calculation done>\n" + res) 
     t 
    } 
    try { 
     Await.result(fut, util.Duration(4, TimeUnit.SECONDS)).toString 
    } catch { 
     case e: TimeoutException => 
     futPrint = true 
     "<ongoing calculation>" 
    } 
    } 
} 

sonra aşağıdaki yarı asenkron Çoğaltma aktive edecek Bir eclipse scala çalışma sayfasının içinde bir programın değerlendirmelerini sonlandırmak.

İlgili konular