Каковы ограничения и обходные пути переводчика Scala? - PullRequest
4 голосов
/ 08 сентября 2010

Какие конструкции требуют компиляции 'scalac' и как создать эквивалент, который будет работать в интерпретаторе?

Редактировать: Я хочу использовать scala вместо python в качестве языка сценариев. (с #! / usr / bin / scala)

Ответы [ 3 ]

6 голосов
/ 08 сентября 2010

Вы должны иметь возможность делать в REPL все, что вы можете делать во внешнем коде. Имейте в виду, что:

  • Вещи, которые обращаются друг к другу по кругу, должны быть внутри одного блока. Таким образом, следующее не может быть введено как есть; Вы должны обернуть его внутри другого объекта:

    class C(i : Int) { def succ = C(i+1) }
    object C { def apply(i: Int) = new C(i) }

  • Среда выполнения несколько иная, поэтому время тестирования не всегда будет таким, как если бы вы запускали их из скомпилированного кода.

  • Вы вводите путь выполнения другим способом; если вы хотите вызвать метод main, вы, конечно, можете это сделать из REPL.

  • Вы не можете просто вырезать и вставить целую библиотеку в REPL и заставить ее работать точно так же, как библиотека; REPL имеет другую структуру, чем обычные пакеты. Поэтому отбросьте декларации "пакета" во время тестирования.

3 голосов
/ 08 сентября 2010

РЕДАКТИРОВАТЬ: после прочтения вашего вопроса, я должен признать, что я действительно не ответил на него;).Но, возможно, это все еще помогает.

Мне известны два ограничения интерпретатора (или REPL), когда речь идет о загрузке файлов scala (для их интерактивного тестирования).

  • Вы не можете загружать файлы scala с определениями пакетов в них.REPL жалуется и не загружает весь класс - это файл scala для загрузки.Он прочитал, что это связано с тем, что файлы, загруженные в REPL, рассматриваются как объект.,,который, конечно, не может содержать никаких определений пакетов.
  • REPL странно (или немного непредсказуемо), когда в classpath есть файлы классов загруженных файлов scala.Прочтите этот вопрос самостоятельно и особенно мои 2 последних комментария ко второму ответу.

Кроме того, существует проблема с циклическими зависимостями, которую я не знаю для обходного пути: Предположим, что есть класс A, который использует класс B, который снова нуждается в A, чтобы выполнить свою работу.Конечно, вы не можете определить A, поскольку нет определения B и наоборот.Предоставление фиктивного значения для одного из них также не работает:

scala> class A {                                           
 |   def alterString(s:String) = s                     
 |   def printStuff(s:String) = println(alterString(s))
 | }                                                   
defined class A

scala> class B {                                           
 |   val prefix = "this is a test: "                   
 |   def doJob() = new A() printStuff "1 2 3"            
 | }
defined class B

scala> class A {
 |   def alterString(s:String) = new B().prefix + s
 |   def printStuff(s:String) = println(alterString(s))
 | }
defined class A

scala> new B().doJob()
1 2 3

scala> 

Хотя я уже предоставил более новое определение A, класс B все еще использовал то, которое присутствовало, когда я его определил.

0 голосов
/ 08 сентября 2010

Я думаю, что все в Scala будет работать и от интерпретатора (который, я думаю, в любом случае просто вызывает компилятор).

Вы подозреваете, что что-то не работает? Или это вопрос с подвохом (я предполагаю, что все, что хочет напрямую взаимодействовать с загрузчиком классов или файлами классов, может вести себя по-разному в двух средах, но я понятия не имею).

...