2012-08-08 2 views
9

스칼라 REPL을 중지/종료하는 단축키가 있습니까?REPL을 중지하는 단축키?

예 : 명령 console을 사용하여 SBT에서 스칼라 REPL을 시작한 다음 무한 루프와 같이 어리석은 일을하고 쉘을 닫지 않고 REPL을 종료하려고합니다. Ctrl 키 + C, Ctrl 키 + D (모든 작동하지 않습니다) 또는 Ctrl 키 + Z 비슷 해요.

업데이트 : 사용 된 운영 체제 : Windows 7 64 Bit.

Ctrl 키를 + D는 + 내가

while(true) prinln("test") 

처럼 무한 루프에서 오전 때 REPL을 종료하지 않습니다 D이 방식이 있는가 SBT와 REPL하지만 Ctrl 키를 존재 쉘을 닫지 않고 단축키로 무한 루프를 빠져 나갑니? 또는 REPL이 루프가 끝날 때까지 단축키에 반응하지 않기 때문에 가능하지 않습니다 (물론이 경우에는 발생하지 않습니다).

+0

어떤 OS를 사용하고 계십니까? ctrl + c가 (MacOS 10.6 하에서) 나를 위해 트릭을하는 것 같으므로 –

+0

당신은'console'을 말하기 때문에 당신은 sbt에서 시작하고 있습니까? –

+0

@MateuszDymczyk 아, 알겠습니다. 이것은 OS 관련 문제 인 것 같습니다. Windows 7 64 Bit Edition을 사용합니다. Ctrl + C가 작동하지 않습니다. –

답변

2

다음은 Scala 2.10.0-M6에서 작동하지만 2.9.2에서는 REPL 전원 모드에서 :wrap을 사용하면 비슷한 결과를 얻을 수 있습니다.

는 REPL은 (당신이 그렇지 않으면 단지 스칼라의 클래스 경로에 ReplUtil 클래스를 넣을 수) 일반성의 손실없이 sbt console —를 통해 SBT에서 시작된다고 가정하자. 다음 클래스가 클래스 경로에 있다고 가정합니다. 소스는 src/main/scala/ReplUtil.scala에있다 : 주제와 관련된

$ 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 인 동안 어떻게 Q가 +6이 될 수 있습니까? 어쨌든, 감싸기를 감안할 때, REPL은 "timed", "interruptible"등의 내장 함수를 포함한 일반적인 템플릿을 필요로합니다. –

0

유용한 시프트를 비 종료에 대한 바인딩 + D 열쇠입니다 :

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>" 
    } 
    } 
} 

이 다음은 반 비동기 REPL을 활성화합니다 일식 스칼라 워크 시트 내부에서 프로그램 평가를 종료합니다.

관련 문제