scalaの高階関数、無名関数リテラルの実装の仕組み

問題です。
昨日のこの記事のソースコンパイルした場合、classファイルはいくつできるでしょうか?


正解は、*113個でした(・∀・)

Hoge$$anonfun$getHtml$1.class
Hoge$$anonfun$main$1.class
Hoge$$anonfun$main$2.class
Hoge$$anonfun$main$3.class
Hoge$$anonfun$main$4.class
Hoge$$anonfun$main$5$$anonfun$apply$1.class
Hoge$$anonfun$main$5.class
Hoge$$anonfun$main$6.class
Hoge$$anonfun$main$7.class
Hoge$$anonfun$main$8.class
Hoge$$anonfun$main$9.class
Hoge$.class
Hoge.class

ちなみに、classファイルっていうのは、Java*2の仕様で決まっていて、
(内部クラスや無名クラスも含めて) class1つに対して、必ず1ファイルと決まっています。

自分が昨日書いたソースは、scalaのソース上は、objectが1つで、defで定義されているメソッドは3つですが、
それが実際コンパイルされた後は、どのようにJavaのclassにマッピングされるかっていうのを書こうかと思います。



ただ注意事項として、(scalaのソースをコンパイルしたあとの)classファイルの数っていうのは、仕様で決まってるかどうか知らないので、もしかしたら、versionなどによって変わるかもしれません。*3

それと、これ以下の説明も、べつに仕様書とか読んだわけではなく、あくまでも自分で分析した結果なのでその辺了解した上で読んでください(´・ω・`)



で、以下が、なぜ13個も生成されるのか?っていう解説

そもそも、objectを定義すると、

Hoge$.class
Hoge.class

のように、そのobject名と、それに$をつけた2つのファイルが必ず作成されます。

あと、

Hoge$$anonfun$main$1.class

から

Hoge$$anonfun$main$9.class

まで、似たような名前で、末尾の数字だけ違うclassファイルが9つ生成されていますが、
これはそれぞれmain関数の中での高階関数使ってる数に、ぴったり一致してますね。
順に、

map map collect collect collect groupBy map sortWith foreach

というように使ってますから。
あとは、

Hoge$$anonfun$main$5$$anonfun$apply$1.class

というファイルですが、5っていうのは、おそらく5番目の高階関数の中って意味でしょう。

5番目って以下の部分ですが、↓

.collect{
      case Some( xmlResponce ) =>
      scala.xml.XML.loadString( xmlResponce ) \\ "nickname" map{_.text} // ← ここ
    }

この中で、もう1つ map 使ってますね。
このように map{_.text}っていう、たった数文字分のコードだとしても、
基本的に1つのclassファイルが生成されます。


同じように、

Hoge$$anonfun$getHtml$1.class

というのは、getHtmlって関数の中で、高階関数使ってますね*4


おまけとして、jadで逆コンパイルしたソース載せておきます。
ちなみに、jadで逆コンパイルするとき、

> jad **/*.class

というように指定すれば、カレントディレクトリ以下のclassファイルまとめて全てやってくれます。
よってそのやり方で逆コンパイルすれば、内部クラスがあったとしても、基本的には1つのソースに戻してくれます。

Hoge$.jad

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Hoge.scala

package test1;

import java.lang.ref.SoftReference;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import scala.*;
import scala.collection.*;
import scala.collection.generic.GenericTraversableTemplate;
import scala.collection.immutable.*;
import scala.io.Source$;
import scala.runtime.*;

// Referenced classes of package test1:
//            Hoge

public final class Hoge$
    implements ScalaObject
{

    public static Method reflMethod$Method1(Class class1)
    {
        if((MethodCache)reflPoly$Cache1.get() == null)
            reflPoly$Cache1 = new SoftReference(new EmptyMethodCache());
        Method method1 = ((MethodCache)reflPoly$Cache1.get()).find(class1);
        if(method1 == null)
        {
            method1 = class1.getMethod("close", reflParams$Cache1);
            method1.setAccessible(true);
            reflPoly$Cache1 = new SoftReference(((MethodCache)reflPoly$Cache1.get()).add(class1, method1));
            return method1;
        } else
        {
            return method1;
        }
    }

    public String getHtml$default$2()
    {
        return "UTF-8";
    }

    public void main(String args[])
    {
        scala.util.matching.Regex atnd$1 = Predef$.MODULE$.augmentString("(http://atnd.org/events/)(\\d+)").r();
        ((LinearSeqOptimized)((TraversableOnce)((GenericTraversableTemplate)((TraversableLike)((TraversableLike)((TraversableLike)((TraversableLike)Predef$.MODULE$.intWrapper(2).to(18).map(new anonfun.main._cls1(), IndexedSeq$.MODULE$.canBuildFrom())).map(new anonfun.main._cls2(), IndexedSeq$.MODULE$.canBuildFrom())).collect(new anonfun.main._cls3(atnd$1), IndexedSeq$.MODULE$.canBuildFrom())).collect(new anonfun.main._cls4(atnd$1), IndexedSeq$.MODULE$.canBuildFrom())).collect(new anonfun.main._cls5(), IndexedSeq$.MODULE$.canBuildFrom())).flatten(Predef$.MODULE$.conforms()).groupBy(new anonfun.main._cls6()).map(new anonfun.main._cls7(), Map$.MODULE$.canBuildFrom())).toList().sortWith(new anonfun.main._cls8())).foreach(new anonfun.main._cls9());
    }

    public Option getHtml(String url, String encode)
    {
        return using(Source$.MODULE$.fromURL(url, encode), new anonfun.getHtml._cls1());
    }

    public Option using(Object resource, Function1 func)
    {
        Option exceptionResult1 = null;
        exceptionResult1 = new Some(func.apply(resource));
        if(resource != null)
        {
            Object qual1 = resource;
            Object exceptionResult2 = null;
            Exception exception;
            Exception exception1;
            InvocationTargetException invocationtargetexception;
            try
            {
                exceptionResult2 = reflMethod$Method1(qual1.getClass()).invoke(qual1, new Object[0]);
            }
            catch(InvocationTargetException invocationtargetexception1)
            {
                throw invocationtargetexception1.getCause();
            }
            exceptionResult2;
            BoxedUnit.UNIT;
        }
        break MISSING_BLOCK_LABEL_103;
        exception;
        exception.printStackTrace();
        exceptionResult1 = None$.MODULE$;
        if(resource != null)
        {
            qual1 = resource;
            exceptionResult2 = null;
            try
            {
                exceptionResult2 = reflMethod$Method1(qual1.getClass()).invoke(qual1, new Object[0]);
            }
            // Misplaced declaration of an exception variable
            catch(InvocationTargetException invocationtargetexception)
            {
                throw invocationtargetexception.getCause();
            }
            exceptionResult2;
            BoxedUnit.UNIT;
        }
        return exceptionResult1;
        exception1;
        if(resource != null)
        {
            qual1 = resource;
            exceptionResult2 = null;
            try
            {
                exceptionResult2 = reflMethod$Method1(qual1.getClass()).invoke(qual1, new Object[0]);
            }
            // Misplaced declaration of an exception variable
            catch(InvocationTargetException invocationtargetexception)
            {
                throw invocationtargetexception.getCause();
            }
            exceptionResult2;
            BoxedUnit.UNIT;
        }
        throw exception1;
    }

    private Hoge$()
    {
    }

    public static final Hoge$ MODULE$ = this;
    private static final Class reflParams$Cache1[] = new Class[0];
    private static volatile SoftReference reflPoly$Cache1 = new SoftReference(new EmptyMethodCache());

    static 
    {
        new Hoge$();
    }
}


Hoge.jad *5

// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   Hoge.scala

package test1;

import java.io.Serializable;
import scala.*;
import scala.collection.*;
import scala.collection.immutable.*;
import scala.collection.mutable.StringBuilder;
import scala.io.BufferedSource;
import scala.runtime.*;
import scala.util.matching.Regex;
import scala.xml.Node;
import scala.xml.XML$;
import scala.xml.factory.XMLLoader;

// Referenced classes of package test1:
//            Hoge$

public final class Hoge
{

    public static final String getHtml$default$2()
    {
        return Hoge$.MODULE$.getHtml$default$2();
    }

    public static final Option using(Object obj, Function1 function1)
    {
        return Hoge$.MODULE$.using(obj, function1);
    }

    public static final Option getHtml(String s, String s1)
    {
        return Hoge$.MODULE$.getHtml(s, s1);
    }

    public static final void main(String args[])
    {
        Hoge$.MODULE$.main(args);
    }

    // Unreferenced inner class test1/Hoge$$anonfun$main$9
    public static final class .anonfun.main._cls9 extends AbstractFunction1
        implements Serializable
    {

        public final void apply(Object obj)
        {
            Predef$.MODULE$.println(obj);
        }

        public final volatile Object apply(Object v1)
        {
            apply(v1);
            return BoxedUnit.UNIT;
        }

        public static final long serialVersionUID = 0L;


            public .anonfun.main._cls9()
            {
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$main$8
    public static final class .anonfun.main._cls8 extends AbstractFunction2
        implements Serializable
    {

        public final boolean apply(Tuple2 tuple2, Tuple2 tuple2_1)
        {
            Tuple2 tuple2_2 = tuple2;
            Tuple2 tuple2_3 = tuple2_1;
            if(tuple2_2 == null)
                throw new MatchError(new Tuple2(tuple2_2, tuple2_3));
            int i = BoxesRunTime.unboxToInt(tuple2_2._2());
            if(tuple2_3 == null)
                throw new MatchError(new Tuple2(tuple2_2, tuple2_3));
            else
                return i > BoxesRunTime.unboxToInt(tuple2_3._2());
        }

        public final volatile Object apply(Object v1, Object v2)
        {
            return BoxesRunTime.boxToBoolean(apply((Tuple2)v1, (Tuple2)v2));
        }

        public static final long serialVersionUID = 0L;


            public .anonfun.main._cls8()
            {
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$main$7
    public static final class .anonfun.main._cls7 extends AbstractFunction1
        implements Serializable
    {

        public final Tuple2 apply(Tuple2 tuple2)
        {
            Tuple2 tuple2_1 = tuple2;
            if(tuple2_1 == null)
                throw new MatchError(tuple2_1);
            else
                return new Tuple2(tuple2_1._1(), BoxesRunTime.boxToInteger(((SeqLike)tuple2_1._2()).size()));
        }

        public final volatile Object apply(Object v1)
        {
            return apply((Tuple2)v1);
        }

        public static final long serialVersionUID = 0L;


            public .anonfun.main._cls7()
            {
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$main$6
    public static final class .anonfun.main._cls6 extends AbstractFunction1
        implements Serializable
    {

        public final String apply(String a)
        {
            return a;
        }

        public final volatile Object apply(Object v1)
        {
            return apply((String)v1);
        }

        public static final long serialVersionUID = 0L;


            public .anonfun.main._cls6()
            {
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$main$5
    public static final class .anonfun.main._cls5
        implements PartialFunction, Serializable
    {

        public PartialFunction orElse(PartialFunction that)
        {
            return scala.PartialFunction.class.orElse(this, that);
        }

        public PartialFunction andThen(Function1 k)
        {
            return scala.PartialFunction.class.andThen(this, k);
        }

        public Function1 lift()
        {
            return scala.PartialFunction.class.lift(this);
        }

        public void apply$mcVI$sp(int v1)
        {
            scala.Function1.class.apply$mcVI$sp(this, v1);
        }

        public boolean apply$mcZI$sp(int v1)
        {
            return scala.Function1.class.apply$mcZI$sp(this, v1);
        }

        public int apply$mcII$sp(int v1)
        {
            return scala.Function1.class.apply$mcII$sp(this, v1);
        }

        public float apply$mcFI$sp(int v1)
        {
            return scala.Function1.class.apply$mcFI$sp(this, v1);
        }

        public long apply$mcLI$sp(int v1)
        {
            return scala.Function1.class.apply$mcLI$sp(this, v1);
        }

        public double apply$mcDI$sp(int v1)
        {
            return scala.Function1.class.apply$mcDI$sp(this, v1);
        }

        public void apply$mcVL$sp(long v1)
        {
            scala.Function1.class.apply$mcVL$sp(this, v1);
        }

        public boolean apply$mcZL$sp(long v1)
        {
            return scala.Function1.class.apply$mcZL$sp(this, v1);
        }

        public int apply$mcIL$sp(long v1)
        {
            return scala.Function1.class.apply$mcIL$sp(this, v1);
        }

        public float apply$mcFL$sp(long v1)
        {
            return scala.Function1.class.apply$mcFL$sp(this, v1);
        }

        public long apply$mcLL$sp(long v1)
        {
            return scala.Function1.class.apply$mcLL$sp(this, v1);
        }

        public double apply$mcDL$sp(long v1)
        {
            return scala.Function1.class.apply$mcDL$sp(this, v1);
        }

        public void apply$mcVF$sp(float v1)
        {
            scala.Function1.class.apply$mcVF$sp(this, v1);
        }

        public boolean apply$mcZF$sp(float v1)
        {
            return scala.Function1.class.apply$mcZF$sp(this, v1);
        }

        public int apply$mcIF$sp(float v1)
        {
            return scala.Function1.class.apply$mcIF$sp(this, v1);
        }

        public float apply$mcFF$sp(float v1)
        {
            return scala.Function1.class.apply$mcFF$sp(this, v1);
        }

        public long apply$mcLF$sp(float v1)
        {
            return scala.Function1.class.apply$mcLF$sp(this, v1);
        }

        public double apply$mcDF$sp(float v1)
        {
            return scala.Function1.class.apply$mcDF$sp(this, v1);
        }

        public void apply$mcVD$sp(double v1)
        {
            scala.Function1.class.apply$mcVD$sp(this, v1);
        }

        public boolean apply$mcZD$sp(double v1)
        {
            return scala.Function1.class.apply$mcZD$sp(this, v1);
        }

        public int apply$mcID$sp(double v1)
        {
            return scala.Function1.class.apply$mcID$sp(this, v1);
        }

        public float apply$mcFD$sp(double v1)
        {
            return scala.Function1.class.apply$mcFD$sp(this, v1);
        }

        public long apply$mcLD$sp(double v1)
        {
            return scala.Function1.class.apply$mcLD$sp(this, v1);
        }

        public double apply$mcDD$sp(double v1)
        {
            return scala.Function1.class.apply$mcDD$sp(this, v1);
        }

        public String toString()
        {
            return scala.Function1.class.toString(this);
        }

        public Function1 compose(Function1 g)
        {
            return scala.Function1.class.compose(this, g);
        }

        public Function1 compose$mcVI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVI$sp(this, g);
        }

        public Function1 compose$mcZI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZI$sp(this, g);
        }

        public Function1 compose$mcII$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcII$sp(this, g);
        }

        public Function1 compose$mcFI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFI$sp(this, g);
        }

        public Function1 compose$mcLI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLI$sp(this, g);
        }

        public Function1 compose$mcDI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDI$sp(this, g);
        }

        public Function1 compose$mcVL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVL$sp(this, g);
        }

        public Function1 compose$mcZL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZL$sp(this, g);
        }

        public Function1 compose$mcIL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcIL$sp(this, g);
        }

        public Function1 compose$mcFL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFL$sp(this, g);
        }

        public Function1 compose$mcLL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLL$sp(this, g);
        }

        public Function1 compose$mcDL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDL$sp(this, g);
        }

        public Function1 compose$mcVF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVF$sp(this, g);
        }

        public Function1 compose$mcZF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZF$sp(this, g);
        }

        public Function1 compose$mcIF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcIF$sp(this, g);
        }

        public Function1 compose$mcFF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFF$sp(this, g);
        }

        public Function1 compose$mcLF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLF$sp(this, g);
        }

        public Function1 compose$mcDF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDF$sp(this, g);
        }

        public Function1 compose$mcVD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVD$sp(this, g);
        }

        public Function1 compose$mcZD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZD$sp(this, g);
        }

        public Function1 compose$mcID$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcID$sp(this, g);
        }

        public Function1 compose$mcFD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFD$sp(this, g);
        }

        public Function1 compose$mcLD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLD$sp(this, g);
        }

        public Function1 compose$mcDD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDD$sp(this, g);
        }

        public Function1 andThen$mcVI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVI$sp(this, g);
        }

        public Function1 andThen$mcZI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZI$sp(this, g);
        }

        public Function1 andThen$mcII$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcII$sp(this, g);
        }

        public Function1 andThen$mcFI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFI$sp(this, g);
        }

        public Function1 andThen$mcLI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLI$sp(this, g);
        }

        public Function1 andThen$mcDI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDI$sp(this, g);
        }

        public Function1 andThen$mcVL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVL$sp(this, g);
        }

        public Function1 andThen$mcZL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZL$sp(this, g);
        }

        public Function1 andThen$mcIL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcIL$sp(this, g);
        }

        public Function1 andThen$mcFL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFL$sp(this, g);
        }

        public Function1 andThen$mcLL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLL$sp(this, g);
        }

        public Function1 andThen$mcDL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDL$sp(this, g);
        }

        public Function1 andThen$mcVF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVF$sp(this, g);
        }

        public Function1 andThen$mcZF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZF$sp(this, g);
        }

        public Function1 andThen$mcIF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcIF$sp(this, g);
        }

        public Function1 andThen$mcFF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFF$sp(this, g);
        }

        public Function1 andThen$mcLF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLF$sp(this, g);
        }

        public Function1 andThen$mcDF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDF$sp(this, g);
        }

        public Function1 andThen$mcVD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVD$sp(this, g);
        }

        public Function1 andThen$mcZD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZD$sp(this, g);
        }

        public Function1 andThen$mcID$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcID$sp(this, g);
        }

        public Function1 andThen$mcFD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFD$sp(this, g);
        }

        public Function1 andThen$mcLD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLD$sp(this, g);
        }

        public Function1 andThen$mcDD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDD$sp(this, g);
        }

        public final Seq apply(Option option)
        {
            Option option1 = option;
            public final class .anonfun.apply._cls1 extends AbstractFunction1
                implements Serializable
            {

                public final String apply(Node node)
                {
                    return node.text();
                }

                public final volatile Object apply(Object v1)
                {
                    return apply((Node)v1);
                }

                public static final long serialVersionUID = 0L;


                    public .anonfun.apply._cls1()
                    {
                    }
            }

            if(option1 instanceof Some)
                return (Seq)XML$.MODULE$.loadString((String)((Some)option1).x()).$bslash$bslash("nickname").map(new .anonfun.apply._cls1(), Seq$.MODULE$.canBuildFrom());
            else
                throw new MatchError(option1);
        }

        public final boolean isDefinedAt(Option option)
        {
            Option option1 = option;
            return option1 instanceof Some;
        }

        public volatile Function1 andThen(Function1 g)
        {
            return andThen(g);
        }

        public final volatile boolean isDefinedAt(Object x)
        {
            return isDefinedAt((Option)x);
        }

        public final volatile Object apply(Object v1)
        {
            return apply((Option)v1);
        }

        public static final long serialVersionUID = 0L;


            public .anonfun.main._cls5()
            {
                scala.Function1.class.$init$(this);
                scala.PartialFunction.class.$init$(this);
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$main$4
    public static final class .anonfun.main._cls4
        implements PartialFunction, Serializable
    {

        public PartialFunction orElse(PartialFunction that)
        {
            return scala.PartialFunction.class.orElse(this, that);
        }

        public PartialFunction andThen(Function1 k)
        {
            return scala.PartialFunction.class.andThen(this, k);
        }

        public Function1 lift()
        {
            return scala.PartialFunction.class.lift(this);
        }

        public void apply$mcVI$sp(int v1)
        {
            scala.Function1.class.apply$mcVI$sp(this, v1);
        }

        public boolean apply$mcZI$sp(int v1)
        {
            return scala.Function1.class.apply$mcZI$sp(this, v1);
        }

        public int apply$mcII$sp(int v1)
        {
            return scala.Function1.class.apply$mcII$sp(this, v1);
        }

        public float apply$mcFI$sp(int v1)
        {
            return scala.Function1.class.apply$mcFI$sp(this, v1);
        }

        public long apply$mcLI$sp(int v1)
        {
            return scala.Function1.class.apply$mcLI$sp(this, v1);
        }

        public double apply$mcDI$sp(int v1)
        {
            return scala.Function1.class.apply$mcDI$sp(this, v1);
        }

        public void apply$mcVL$sp(long v1)
        {
            scala.Function1.class.apply$mcVL$sp(this, v1);
        }

        public boolean apply$mcZL$sp(long v1)
        {
            return scala.Function1.class.apply$mcZL$sp(this, v1);
        }

        public int apply$mcIL$sp(long v1)
        {
            return scala.Function1.class.apply$mcIL$sp(this, v1);
        }

        public float apply$mcFL$sp(long v1)
        {
            return scala.Function1.class.apply$mcFL$sp(this, v1);
        }

        public long apply$mcLL$sp(long v1)
        {
            return scala.Function1.class.apply$mcLL$sp(this, v1);
        }

        public double apply$mcDL$sp(long v1)
        {
            return scala.Function1.class.apply$mcDL$sp(this, v1);
        }

        public void apply$mcVF$sp(float v1)
        {
            scala.Function1.class.apply$mcVF$sp(this, v1);
        }

        public boolean apply$mcZF$sp(float v1)
        {
            return scala.Function1.class.apply$mcZF$sp(this, v1);
        }

        public int apply$mcIF$sp(float v1)
        {
            return scala.Function1.class.apply$mcIF$sp(this, v1);
        }

        public float apply$mcFF$sp(float v1)
        {
            return scala.Function1.class.apply$mcFF$sp(this, v1);
        }

        public long apply$mcLF$sp(float v1)
        {
            return scala.Function1.class.apply$mcLF$sp(this, v1);
        }

        public double apply$mcDF$sp(float v1)
        {
            return scala.Function1.class.apply$mcDF$sp(this, v1);
        }

        public void apply$mcVD$sp(double v1)
        {
            scala.Function1.class.apply$mcVD$sp(this, v1);
        }

        public boolean apply$mcZD$sp(double v1)
        {
            return scala.Function1.class.apply$mcZD$sp(this, v1);
        }

        public int apply$mcID$sp(double v1)
        {
            return scala.Function1.class.apply$mcID$sp(this, v1);
        }

        public float apply$mcFD$sp(double v1)
        {
            return scala.Function1.class.apply$mcFD$sp(this, v1);
        }

        public long apply$mcLD$sp(double v1)
        {
            return scala.Function1.class.apply$mcLD$sp(this, v1);
        }

        public double apply$mcDD$sp(double v1)
        {
            return scala.Function1.class.apply$mcDD$sp(this, v1);
        }

        public String toString()
        {
            return scala.Function1.class.toString(this);
        }

        public Function1 compose(Function1 g)
        {
            return scala.Function1.class.compose(this, g);
        }

        public Function1 compose$mcVI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVI$sp(this, g);
        }

        public Function1 compose$mcZI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZI$sp(this, g);
        }

        public Function1 compose$mcII$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcII$sp(this, g);
        }

        public Function1 compose$mcFI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFI$sp(this, g);
        }

        public Function1 compose$mcLI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLI$sp(this, g);
        }

        public Function1 compose$mcDI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDI$sp(this, g);
        }

        public Function1 compose$mcVL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVL$sp(this, g);
        }

        public Function1 compose$mcZL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZL$sp(this, g);
        }

        public Function1 compose$mcIL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcIL$sp(this, g);
        }

        public Function1 compose$mcFL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFL$sp(this, g);
        }

        public Function1 compose$mcLL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLL$sp(this, g);
        }

        public Function1 compose$mcDL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDL$sp(this, g);
        }

        public Function1 compose$mcVF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVF$sp(this, g);
        }

        public Function1 compose$mcZF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZF$sp(this, g);
        }

        public Function1 compose$mcIF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcIF$sp(this, g);
        }

        public Function1 compose$mcFF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFF$sp(this, g);
        }

        public Function1 compose$mcLF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLF$sp(this, g);
        }

        public Function1 compose$mcDF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDF$sp(this, g);
        }

        public Function1 compose$mcVD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVD$sp(this, g);
        }

        public Function1 compose$mcZD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZD$sp(this, g);
        }

        public Function1 compose$mcID$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcID$sp(this, g);
        }

        public Function1 compose$mcFD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFD$sp(this, g);
        }

        public Function1 compose$mcLD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLD$sp(this, g);
        }

        public Function1 compose$mcDD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDD$sp(this, g);
        }

        public Function1 andThen$mcVI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVI$sp(this, g);
        }

        public Function1 andThen$mcZI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZI$sp(this, g);
        }

        public Function1 andThen$mcII$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcII$sp(this, g);
        }

        public Function1 andThen$mcFI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFI$sp(this, g);
        }

        public Function1 andThen$mcLI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLI$sp(this, g);
        }

        public Function1 andThen$mcDI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDI$sp(this, g);
        }

        public Function1 andThen$mcVL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVL$sp(this, g);
        }

        public Function1 andThen$mcZL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZL$sp(this, g);
        }

        public Function1 andThen$mcIL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcIL$sp(this, g);
        }

        public Function1 andThen$mcFL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFL$sp(this, g);
        }

        public Function1 andThen$mcLL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLL$sp(this, g);
        }

        public Function1 andThen$mcDL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDL$sp(this, g);
        }

        public Function1 andThen$mcVF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVF$sp(this, g);
        }

        public Function1 andThen$mcZF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZF$sp(this, g);
        }

        public Function1 andThen$mcIF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcIF$sp(this, g);
        }

        public Function1 andThen$mcFF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFF$sp(this, g);
        }

        public Function1 andThen$mcLF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLF$sp(this, g);
        }

        public Function1 andThen$mcDF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDF$sp(this, g);
        }

        public Function1 andThen$mcVD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVD$sp(this, g);
        }

        public Function1 andThen$mcZD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZD$sp(this, g);
        }

        public Function1 andThen$mcID$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcID$sp(this, g);
        }

        public Function1 andThen$mcFD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFD$sp(this, g);
        }

        public Function1 andThen$mcLD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLD$sp(this, g);
        }

        public Function1 andThen$mcDD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDD$sp(this, g);
        }

        public final Option apply(Option option)
        {
            Option option1 = option;
            if(option1 instanceof Some)
            {
                Some some = (Some)option1;
                String s = (String)some.x();
                Option option2 = atnd$1.unapplySeq(s);
                if(option2.isEmpty())
                    throw new MatchError(option1);
                List list = (List)option2.get();
                if(list != null ? list.lengthCompare(2) == 0 : false)
                    return Hoge$.MODULE$.getHtml((new StringBuilder()).append("http://api.atnd.org/events/users/?event_id=").append(list.apply(1)).toString(), Hoge$.MODULE$.getHtml$default$2());
                else
                    throw new MatchError(option1);
            } else
            {
                throw new MatchError(option1);
            }
        }

        public final boolean isDefinedAt(Option option)
        {
            Option option1 = option;
            if(!(option1 instanceof Some)) goto _L2; else goto _L1
_L1:
            Option option2;
            Some some = (Some)option1;
            String s = (String)some.x();
            option2 = atnd$1.unapplySeq(s);
            List list;
            option2.isEmpty() ? false : (list = (List)option2.get()) != null ? list.lengthCompare(2) == 0 : false;
              goto _L3
_L2:
            false;
_L3:
            return;
        }

        public volatile Function1 andThen(Function1 g)
        {
            return andThen(g);
        }

        public final volatile boolean isDefinedAt(Object x)
        {
            return isDefinedAt((Option)x);
        }

        public final volatile Object apply(Object v1)
        {
            return apply((Option)v1);
        }

        public static final long serialVersionUID = 0L;
        private final Regex atnd$1;


            public .anonfun.main._cls4(Regex regex)
            {
                atnd$1 = regex;
                super();
                scala.Function1.class.$init$(this);
                scala.PartialFunction.class.$init$(this);
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$main$3
    public static final class .anonfun.main._cls3
        implements PartialFunction, Serializable
    {

        public PartialFunction orElse(PartialFunction that)
        {
            return scala.PartialFunction.class.orElse(this, that);
        }

        public PartialFunction andThen(Function1 k)
        {
            return scala.PartialFunction.class.andThen(this, k);
        }

        public Function1 lift()
        {
            return scala.PartialFunction.class.lift(this);
        }

        public void apply$mcVI$sp(int v1)
        {
            scala.Function1.class.apply$mcVI$sp(this, v1);
        }

        public boolean apply$mcZI$sp(int v1)
        {
            return scala.Function1.class.apply$mcZI$sp(this, v1);
        }

        public int apply$mcII$sp(int v1)
        {
            return scala.Function1.class.apply$mcII$sp(this, v1);
        }

        public float apply$mcFI$sp(int v1)
        {
            return scala.Function1.class.apply$mcFI$sp(this, v1);
        }

        public long apply$mcLI$sp(int v1)
        {
            return scala.Function1.class.apply$mcLI$sp(this, v1);
        }

        public double apply$mcDI$sp(int v1)
        {
            return scala.Function1.class.apply$mcDI$sp(this, v1);
        }

        public void apply$mcVL$sp(long v1)
        {
            scala.Function1.class.apply$mcVL$sp(this, v1);
        }

        public boolean apply$mcZL$sp(long v1)
        {
            return scala.Function1.class.apply$mcZL$sp(this, v1);
        }

        public int apply$mcIL$sp(long v1)
        {
            return scala.Function1.class.apply$mcIL$sp(this, v1);
        }

        public float apply$mcFL$sp(long v1)
        {
            return scala.Function1.class.apply$mcFL$sp(this, v1);
        }

        public long apply$mcLL$sp(long v1)
        {
            return scala.Function1.class.apply$mcLL$sp(this, v1);
        }

        public double apply$mcDL$sp(long v1)
        {
            return scala.Function1.class.apply$mcDL$sp(this, v1);
        }

        public void apply$mcVF$sp(float v1)
        {
            scala.Function1.class.apply$mcVF$sp(this, v1);
        }

        public boolean apply$mcZF$sp(float v1)
        {
            return scala.Function1.class.apply$mcZF$sp(this, v1);
        }

        public int apply$mcIF$sp(float v1)
        {
            return scala.Function1.class.apply$mcIF$sp(this, v1);
        }

        public float apply$mcFF$sp(float v1)
        {
            return scala.Function1.class.apply$mcFF$sp(this, v1);
        }

        public long apply$mcLF$sp(float v1)
        {
            return scala.Function1.class.apply$mcLF$sp(this, v1);
        }

        public double apply$mcDF$sp(float v1)
        {
            return scala.Function1.class.apply$mcDF$sp(this, v1);
        }

        public void apply$mcVD$sp(double v1)
        {
            scala.Function1.class.apply$mcVD$sp(this, v1);
        }

        public boolean apply$mcZD$sp(double v1)
        {
            return scala.Function1.class.apply$mcZD$sp(this, v1);
        }

        public int apply$mcID$sp(double v1)
        {
            return scala.Function1.class.apply$mcID$sp(this, v1);
        }

        public float apply$mcFD$sp(double v1)
        {
            return scala.Function1.class.apply$mcFD$sp(this, v1);
        }

        public long apply$mcLD$sp(double v1)
        {
            return scala.Function1.class.apply$mcLD$sp(this, v1);
        }

        public double apply$mcDD$sp(double v1)
        {
            return scala.Function1.class.apply$mcDD$sp(this, v1);
        }

        public String toString()
        {
            return scala.Function1.class.toString(this);
        }

        public Function1 compose(Function1 g)
        {
            return scala.Function1.class.compose(this, g);
        }

        public Function1 compose$mcVI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVI$sp(this, g);
        }

        public Function1 compose$mcZI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZI$sp(this, g);
        }

        public Function1 compose$mcII$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcII$sp(this, g);
        }

        public Function1 compose$mcFI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFI$sp(this, g);
        }

        public Function1 compose$mcLI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLI$sp(this, g);
        }

        public Function1 compose$mcDI$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDI$sp(this, g);
        }

        public Function1 compose$mcVL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVL$sp(this, g);
        }

        public Function1 compose$mcZL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZL$sp(this, g);
        }

        public Function1 compose$mcIL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcIL$sp(this, g);
        }

        public Function1 compose$mcFL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFL$sp(this, g);
        }

        public Function1 compose$mcLL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLL$sp(this, g);
        }

        public Function1 compose$mcDL$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDL$sp(this, g);
        }

        public Function1 compose$mcVF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVF$sp(this, g);
        }

        public Function1 compose$mcZF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZF$sp(this, g);
        }

        public Function1 compose$mcIF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcIF$sp(this, g);
        }

        public Function1 compose$mcFF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFF$sp(this, g);
        }

        public Function1 compose$mcLF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLF$sp(this, g);
        }

        public Function1 compose$mcDF$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDF$sp(this, g);
        }

        public Function1 compose$mcVD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcVD$sp(this, g);
        }

        public Function1 compose$mcZD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcZD$sp(this, g);
        }

        public Function1 compose$mcID$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcID$sp(this, g);
        }

        public Function1 compose$mcFD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcFD$sp(this, g);
        }

        public Function1 compose$mcLD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcLD$sp(this, g);
        }

        public Function1 compose$mcDD$sp(Function1 g)
        {
            return scala.Function1.class.compose$mcDD$sp(this, g);
        }

        public Function1 andThen$mcVI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVI$sp(this, g);
        }

        public Function1 andThen$mcZI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZI$sp(this, g);
        }

        public Function1 andThen$mcII$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcII$sp(this, g);
        }

        public Function1 andThen$mcFI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFI$sp(this, g);
        }

        public Function1 andThen$mcLI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLI$sp(this, g);
        }

        public Function1 andThen$mcDI$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDI$sp(this, g);
        }

        public Function1 andThen$mcVL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVL$sp(this, g);
        }

        public Function1 andThen$mcZL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZL$sp(this, g);
        }

        public Function1 andThen$mcIL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcIL$sp(this, g);
        }

        public Function1 andThen$mcFL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFL$sp(this, g);
        }

        public Function1 andThen$mcLL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLL$sp(this, g);
        }

        public Function1 andThen$mcDL$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDL$sp(this, g);
        }

        public Function1 andThen$mcVF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVF$sp(this, g);
        }

        public Function1 andThen$mcZF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZF$sp(this, g);
        }

        public Function1 andThen$mcIF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcIF$sp(this, g);
        }

        public Function1 andThen$mcFF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFF$sp(this, g);
        }

        public Function1 andThen$mcLF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLF$sp(this, g);
        }

        public Function1 andThen$mcDF$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDF$sp(this, g);
        }

        public Function1 andThen$mcVD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcVD$sp(this, g);
        }

        public Function1 andThen$mcZD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcZD$sp(this, g);
        }

        public Function1 andThen$mcID$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcID$sp(this, g);
        }

        public Function1 andThen$mcFD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcFD$sp(this, g);
        }

        public Function1 andThen$mcLD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcLD$sp(this, g);
        }

        public Function1 andThen$mcDD$sp(Function1 g)
        {
            return scala.Function1.class.andThen$mcDD$sp(this, g);
        }

        public final Option apply(Option option)
        {
            Option option1 = option;
            if(option1 instanceof Some)
                return atnd$1.findFirstIn((CharSequence)((Some)option1).x());
            else
                throw new MatchError(option1);
        }

        public final boolean isDefinedAt(Option option)
        {
            Option option1 = option;
            return option1 instanceof Some;
        }

        public volatile Function1 andThen(Function1 g)
        {
            return andThen(g);
        }

        public final volatile boolean isDefinedAt(Object x)
        {
            return isDefinedAt((Option)x);
        }

        public final volatile Object apply(Object v1)
        {
            return apply((Option)v1);
        }

        public static final long serialVersionUID = 0L;
        private final Regex atnd$1;


            public .anonfun.main._cls3(Regex regex)
            {
                atnd$1 = regex;
                super();
                scala.Function1.class.$init$(this);
                scala.PartialFunction.class.$init$(this);
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$main$2
    public static final class .anonfun.main._cls2 extends AbstractFunction1
        implements Serializable
    {

        public final Option apply(String s)
        {
            return Hoge$.MODULE$.getHtml(s, Hoge$.MODULE$.getHtml$default$2());
        }

        public final volatile Object apply(Object v1)
        {
            return apply((String)v1);
        }

        public static final long serialVersionUID = 0L;


            public .anonfun.main._cls2()
            {
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$main$1
    public static final class .anonfun.main._cls1 extends AbstractFunction1
        implements Serializable
    {

        public final String apply(int n)
        {
            return (new StringBuilder()).append("http://scala-users.org/shibuya/index.php?title=%E5%8B%89%E5%BC%B7%E4%BC%9A%E7%AC%AC").append(BoxesRunTime.boxToInteger(n)).append("%E5%9B%9E").toString();
        }

        public final volatile Object apply(Object v1)
        {
            return apply(BoxesRunTime.unboxToInt(v1));
        }

        public static final long serialVersionUID = 0L;


            public .anonfun.main._cls1()
            {
            }
    }


    // Unreferenced inner class test1/Hoge$$anonfun$getHtml$1
    public static final class .anonfun.getHtml._cls1 extends AbstractFunction1
        implements Serializable
    {

        public final String apply(BufferedSource bufferedsource)
        {
            return bufferedsource.mkString();
        }

        public final volatile Object apply(Object v1)
        {
            return apply((BufferedSource)v1);
        }

        public static final long serialVersionUID = 0L;


            public .anonfun.getHtml._cls1()
            {
            }
    }

}

*1:とりあえず自分の環境では

*2:というよりJVMか?

*3: あと、コンパイル時のオプションとかでも変わるかも

*4:自作したusingというメソッドが、引数に関数を取るメソッド

*5: なんと、逆コンパイルすると1571行もあるw