2013-06-05 3 views
0

Какой лучший способ расширить синтаксис Scala? Например, я хочу, чтобы добавить что-то вроде этого (C++):Как продлить синтаксис Scala

int s = (1 > 2) ? 3 : 4; 

или (Python):

var s = 0 
if 1 < 4: 
    s = 3 + 5 
else: 
    s = 8 - 9 
print(s) 

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

+3

'val s = (1> 2)? 3: 4; 'C++ ??? оо ??? – 4lex1v

+2

@AlexIv 'int s = (1> 2)? 3: 4; '[будет очевидно работать] (http://codepad.org/B3WzZZ75). Идея состоит в том, чтобы использовать тройной if (и это просто пример, если я правильно понимаю). –

+0

Scala уже имеет условные выражения. Пожалуйста, обратитесь к языковой спецификации: http://iainmcgin.github.io/scala-ref-markdown/#conditional-expressions – folone

ответ

3

Как и другие плакаты комментировали, вы должны выразить это в идиоматических Scala:

scala> Some(1) filter (_ > 2) map (_ => 3) getOrElse 4 
res0: Int = 4 

scala> Some(1) filter (_ < 2) map (_ => 3) getOrElse 4 
res1: Int = 3 

(Бека использование твитов о грамматике, перемещение этого из ML :)

Colon - это вид взятого. Это трибула с тем, что вы пытаетесь.

Я думаю, что трибуны должны быть произнесены как триббл.

package tribool 

object Test extends App { 
    class TriBool[A](b: Boolean, a: =>A) { 
    def getOrElse[B >: A](other: =>B): B = this := other 
    def :=[B >: A](other: =>B) = if (b) a else other 
    } 

    // enhance Boolean with ? 
    implicit class TriBool_?(val b: Boolean) extends AnyVal { 
    def ?[A](a: =>A): TriBool[A] = new TriBool(b, a) 
    } 

    val s = (2 > 1) ? "higher" := "lower" 
    Console println s 
    def c = { println("eval c"); true } 
    def a = { println("eval a"); "yes" } 
    def b = { println("eval b"); "no" } 
    Console println (c ? a := b) 
    Console println (!c ? a := b) 
} 
6

Поскольку если-то еще построить в Scala является выражением, вы можете получить довольно близко без каких-либо расширений:

scala> val s = if (1 > 2) 3 else 4 
s: Int = 4 
+0

да, но еще как * четыре * нажатия клавиш! –

+0

@ som-snytt и ваше решение с неявным классом и оберткой определенно короче =) – 4lex1v

+0

@AlexIv, только если вы встаете на ветер или вниз по течению. Кстати, он не только сохраняет 3 символа, но и изолирует ваш проект от неизбежного, если ... затем, сохраняя 5 символов плюс import language.oldIfs. –

2

В Scala можно заменить любое выражение с помощью if-еще-конструкции:

val s = if (1 > 2) 3 else 4 
Смежные вопросы