4

次のモジュールが Scala 2.8.RC[1,2] でコンパイルされないのはなぜですか?

object Test {

import util.matching.Regex._

val pVoid = """\s*void\s*""".r
val pVoidPtr = """\s*(const\s+)?void\s*\*\s*""".r
val pCharPtr = """\s*(const\s+)GLchar\s*\*\s*""".r
val pIntPtr = """\s*(const\s+)?GLint\s*\*\s*""".r
val pUintPtr = """\s*(const\s+)?GLuint\s*\*\s*""".r
val pFloatPtr = """\s*(const\s+)?GLfloat\s*\*\s*""".r
val pDoublePtr = """\s*(const\s+)?GLdouble\s*\*\s*""".r
val pShortPtr = """\s*(const\s+)?GLshort\s*\*\s*""".r
val pUshortPtr = """\s*(const\s+)?GLushort\s*\*\s*""".r
val pInt64Ptr = """\s*(const\s+)?GLint64\s*\*\s*""".r
val pUint64Ptr = """\s*(const\s+)?GLuint64\s*\*\s*""".r

def mapType(t: String): String = t.trim match {
  case pVoid() => "Unit"
  case pVoidPtr() => "ByteBuffer"
  case pCharPtr() => "CharBuffer"
  case pIntPtr() | pUintPtr() => "IntBuffer"
  case pFloatPtr() => "FloatBuffer"
  case pShortPtr() | pUshortPtr() => "ShortBuffer"
  case pDoublePtr() => "DoubleBuffer"
  case pInt64Ptr() | pUint64Ptr() => "LongBuffer"
  case x => x
}
}

更新 1

回答のアドバイスに従った後の次の問題は、コンパイルが長すぎることです。興味深いことに、上記の case ステートメントを 2 つ削除すると、次のコンパイラ エラーが発生します。

object Test {

    import util.matching.Regex._

    val PVoid = """\s*void\s*""".r
    val PVoidPtr = """\s*(const\s+)?void\s*\*\s*""".r
    val PCharPtr = """\s*(const\s+)GLchar\s*\*\s*""".r
    val PIntPtr = """\s*(const\s+)?GLint\s*\*\s*""".r
    val PUintPtr = """\s*(const\s+)?GLuint\s*\*\s*""".r
    val PFloatPtr = """\s*(const\s+)?GLfloat\s*\*\s*""".r
    val PDoublePtr = """\s*(const\s+)?GLdouble\s*\*\s*""".r
    val PShortPtr = """\s*(const\s+)?GLshort\s*\*\s*""".r
    val PUshortPtr = """\s*(const\s+)?GLushort\s*\*\s*""".r
    val PInt64Ptr = """\s*(const\s+)?GLint64\s*\*\s*""".r
    val PUint64Ptr = """\s*(const\s+)?GLuint64\s*\*\s*""".r

    def mapType(t: String): String = t.trim match {
      case PVoid() => "Unit"
      case PVoidPtr() => "ByteBuffer"
      case PCharPtr() => "CharBuffer"
      case PIntPtr() | PUintPtr() => "IntBuffer"
      case PFloatPtr() => "FloatBuffer"
      case PShortPtr() | PUshortPtr() => "ShortBuffer"
      case PDoublePtr() => "DoubleBuffer"
      case PInt64Ptr() | PUint64Ptr() => "LongBuffer"
      case x => x
    }
}


Exception in thread "main" java.lang.Error:ch.epfl.lamp.fjbg.JCode$OffsetTooBigException: offset too big to fit in 16 bits: 43772
at ch.epfl.lamp.fjbg.JFieldOrMethod.writeTo(JFieldOrMethod.java:114)
at ch.epfl.lamp.fjbg.JClass.writeTo(JClass.java:315)
4

1 に答える 1

3

util.matching.Regexを Extractor パターンとして使用しようとしています。このクラスはunapplySeqメソッドを定義しているため、これを行うことができます。パターン マッチングでは、エクストラクタ パターンへの参照は大文字で始める必要があります。

val PVoid = """\s*void\s*""".r

def mapType(t: String): String = t.trim match {
  case PVoid() => "Unit"
  case x => x
}

アップデート

コードの完全でコンパイル可能なバージョンは次のとおりです。

object Test {

    import util.matching.Regex._

    val PVoid = """\s*void\s*""".r
    val PVoidPtr = """\s*(const\s+)?void\s*\*\s*""".r
    val PCharPtr = """\s*(const\s+)GLchar\s*\*\s*""".r
    val PIntPtr = """\s*(const\s+)?GLint\s*\*\s*""".r
    val PUintPtr = """\s*(const\s+)?GLuint\s*\*\s*""".r
    val PFloatPtr = """\s*(const\s+)?GLfloat\s*\*\s*""".r
    val PDoublePtr = """\s*(const\s+)?GLdouble\s*\*\s*""".r
    val PShortPtr = """\s*(const\s+)?GLshort\s*\*\s*""".r
    val PUshortPtr = """\s*(const\s+)?GLushort\s*\*\s*""".r
    val PInt64Ptr = """\s*(const\s+)?GLint64\s*\*\s*""".r
    val PUint64Ptr = """\s*(const\s+)?GLuint64\s*\*\s*""".r

    def mapType(t: String): String = t.trim match {
      case PVoid() => "Unit"
      case PVoidPtr() => "ByteBuffer"
      case PCharPtr() => "CharBuffer"
      case PIntPtr() | PUintPtr() => "IntBuffer"
      case x => x match {
        case PFloatPtr() => "FloatBuffer"
        case PShortPtr() | PUshortPtr() => "ShortBuffer"
        case PDoublePtr() => "DoubleBuffer"
        case PInt64Ptr() | PUint64Ptr() => "LongBuffer"
        case x => x
      }
    }
}

パターン マッチはバグ#1113を回避するために途中で分割されます。

于 2010-05-24T11:19:08.837 に答える