přihlásit se
k47.cz
Už deset let na vašich monitorech.

Scala - Zřetězené porovnávání

autor: kaja47 - CC by - publikováno: - sekce obsah » programování #2277

Perl 6 (Duke Nukem Forever mezi programovacími jazyky, který je mimochodem naprosto epic), má neuvěřitelně bohatou syntaxi a jednou z tisíce vychytávek je zřetězené porovnávání, kdy můžete zapsat podmínku ve tvaru 20 <= $temperature <= 25. Když se na to podíváte, dává to smysl na první pohled, ale většina jazyků výraz nevyhodnotí jako 20 <= $temperature && $temperature <= 25, ale jako (20 <= $temperature) <= 25, což není, co by člověk chtěl.

Nicméně i zřetězené porovnávání se dá docela pěkně implementovat ve Scale.

class CC[T <% Ordered[T]](val v: T, val b: Boolean = true) {
// view bound T <% Ordered[T] zaručuje, že T má metody <, >, <=, >=

  def toBool = b

  private def make(x: Boolean) = new CC(v, b && x)

  def <<:(a: CC[T]) = make(a.v < v) // <: je klíčové slovo - tzv. upper type bound
  def :<<(a: CC[T]) = make(v < a.v)

  def >>:(a: CC[T]) = make(a.v > v) // >: je klíčové slovo - tzv. lower type bound
  def :>>(a: CC[T]) = make(v > a.v)

  def <=:(a: CC[T]) = make(a.v <= v)
  def :<=(a: CC[T]) = make(v <= a.v)

  def >=:(a: CC[T]) = make(a.v >= v)
  def :>=(a: CC[T]) = make(v >= a.v)

  override def toString() = "CC " + b.toString
}

implicit def v2cc[T <% Ordered[T]](v: T) = new CC(v)
implicit def cc2b[T](v: CC[T]) = v.toBool

// test
val a = 20
val b = 15

if (10 <<: a :<< 30) { println("ok") } else { println("chyba") }
if (10 <<: a :<< 15) { println("chyba") } else { println("ok") }
if (10 <<: a :>> b)  { println("ok") } else { println("chyba") }

Metody končící dvojtečkou se v pozici operátorů volají v opačném pořadí. Metody se bohužel nemůžou jmenovat <: a >:, protože to jsou klíčová slova. Teoreticky všechny metody začínající dvojtečkou by mohly mít podobu standardních operátorů porovnání (tedy místo :<< by se použilo <, místo :>> pak > atd), ale z důvodu konzistence a jako signál, že se děje něco nekalého, jsem nechal tvar takový jaký je.

Mimochodem, příklad funguje díky tomu, že kompilátor implicitními konverzemi transformuje výraz 10 <<: 15 :<< 20 na cc2b(bv2cc(15).<<:(10).:<<(20)).


komentáře RSS

Zatím žádné komentáře. Buďte první.
Komentář bude formátován pomocí Texy! syntaxe.
Např: **tučný text**, *kurzíva*, "text odkazu":adresa.
Na ostatní komentáře můžete odkazovat pomocí [čísla komentáře].

Napište komentář!

 

o autorovi:

K. Jmenuji se Karel Čížex, v síti také známý jako kaja47 - tak trochu spisovatel, trochu programátor, trochu webař, milovník divné hudby atd atd.
mail:
jabber: kaja47@jabbim.cz

další projekty

wyhledawacz fel.log stalkr vtipy.k47.cz k47.shop Zkracovač adres stripbot

živě z twitteru

N/A

tadá

poslední články

H. P. Lovecraft
článek | 20. listopadu 2014
Hororoskopy
projekt | 29. října 2014
#299
článek | 27. srpna 2014
O čem mluvím, když mluvím o Murakamim
článek | 31. července 2014
Kafe v pět
povídka | 30. června 2014
O bestii
povídka | 30. června 2014
Úvod do zrcadel a labyrintů
článek | 12. května 2014

poslední komentáře

MySQL group by trik
mrsa | 20. března 2014
Vodník
cbvcxy | 22. února 2014
Rozdělení velkých tříd ve Scale
JeLiTo | 11. ledna 2014
Božena Němcová - V zámku a podzámčí
Anonym | 27. prosince 2013
Sedm let post-rocku
Woodbin | 9. prosince 2013

největší kecalové

Anonym Anonym
JeLito JeLito
mrsa mrsa
Okurka369 Okurka369
cbvcxy cbvcxy

K47i © 2002 - 2014 K. aka Kaja47