SORU
24 HAZİRAN 2010, PERŞEMBE


Kuyruk özyinelemeli fonksiyon optimize edilmiş olduğundan emin olmak için Scala açıklama nedir?

@tailrec derleyici kuyruk özyinelemeli fonksiyon optimize sağlamak için ek açıklama olduğunu düşünüyorum. Sadece bildirimi önüne koymak mı? Ayrıca eğer Scala komut modu (ÇOĞALTMA altında örnek :load <file> kullanmak için) kullanılırsa işe yarıyor mu?

CEVAP
24 HAZİRAN 2010, PERŞEMBE


"Tail calls, @tailrec and trampolines" blog yazısı:

  • Scala 2.8, da @tailrec hangi yöntemleri optimize edilmiş bilgi almak için yeni açıklama kullanabilecektir.
    Bu açıklama derleyici optimize eder umut özel yöntemler işaretlemek sağlar.
    Eğer derleyici tarafından optimize varsa bir uyarı alacaksınız.
  • Ya da daha önce Scala 2.7, manuel test veya bayt kodu muayene güvenmek, optimize edilmiş bir yöntem olup olmadığını bulmak gerekir.

Örnek:

değişikliklerinizi çalışmış emin olabilirsiniz @tailrec ek açıklama ekleyebilirsiniz.

import scala.annotation.tailrec

class Factorial2 {
  def factorial(n: Int): Int = {
    @tailrec def factorialAcc(acc: Int, n: Int): Int = {
      if (n <= 1) acc
      else factorialAcc(n * acc, n - 1)
    }
    factorialAcc(1, n)
  }
}

Ve ÇOĞALTMA (Scala REPL tips and tricks dan örnek) çalışır:

C:\Prog\Scala\tests>scala
Welcome to Scala version 2.8.0.RC5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_18).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.annotation.tailrec
import scala.annotation.tailrec

scala> class Tails {
     | @tailrec def boom(x: Int): Int = {
     | if (x == 0) throw new Exception("boom!")
     | else boom(x-1)  1
     | }
     | @tailrec def bang(x: Int): Int = {
     | if (x == 0) throw new Exception("bang!")
     | else bang(x-1)
     | }
     | }
<console>:9: error: could not optimize @tailrec annotated method: it contains a recursive call not in tail position
       @tailrec def boom(x: Int): Int = {
                    ^
<console>:13: error: could not optimize @tailrec annotated method: it is neither private nor final so can be overridden
       @tailrec def bang(x: Int): Int = {
                    ^

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • Perihelion

    Perihelion

    23 NİSAN 2008
  • Stanislav Petrov

    Stanislav Pe

    7 ŞUBAT 2009