[trend_fp] [Scala反組譯小幫手] Higher Order Function

  • From: 方鍾豪 <mike1026915.cs96@xxxxxxxxxxxxxx>
  • To: trend_fp@xxxxxxxxxxxxx
  • Date: Fri, 14 Aug 2015 14:36:37 +0800

可以參考我寫的 Test.scala 跟 反組譯的結果 Test.jad

結論感覺他是藉由ㄓ實做 scala.Serializable 這個 interface 來實做function傳遞這件事


第一個範例
Scala:
(1 to 9).reduceLeft(_*_)

Java
RichInt$.MODULE$.to$extension0(Predef$.MODULE$.intWrapper(1), 9).
*reduceLeft*(new *Serializable*() {

public final int apply(int x$1, int x$2)
{
return apply$mcIII$sp(x$1, x$2);
}

public int apply$mcIII$sp(int x$1, int x$2)
{
return *x$1 * x$2*; // function 功能
}

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

public static final long serialVersionUID = 0L;

});

第二個範例 -> Java實做直接簡化了
Scala:
def mulOneAtTime(x: Int)(y: Int) = x * y

mulOneAtTime(6)(7)

Java
public int mulOneAtTime(int x, int y)
{
return x * y;
}

mulOneAtTime(6, 7);

第三個範例
Scala
def until(condition: => Boolean)(block: => Unit)
{
if(!condition)
{
block
until(condition)(block)
}
}

def test_until = // call until
{
var x = 10
until(x == 0)
{
x -= 1
println(x)
}

mulOneAtTime(6)(7)

}

Java
public void until(*Function0 *condition, *Function0 *block)
{
if(!condition.apply$mcZ$sp())
{
block.apply$mcV$sp();
until(condition, block);
}
}

public int test_until()
{
IntRef x = new IntRef(10);
until(new *Serializable*(x) {

public final boolean apply()
{
return apply$mcZ$sp();
}

public boolean apply$mcZ$sp()
{
return x*$3.elem == 0;*
}

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

public static final long serialVersionUID = 0L;
private final IntRef x$3;

public
{
this.x$3 = x$3;
super();
}
}, new *Serializable*(x) {

public final void apply()
{
apply$mcV$sp();
}

public void apply$mcV$sp()
{
* x$3.elem = x$3.elem - 1;*
*
Predef$.MODULE$.println(BoxesRunTime.boxToInteger(x$3.elem));*
}

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

public static final long serialVersionUID = 0L;
private final IntRef x$3;

public
{
this.x$3 = x$3;
super();
}
});
}

Best Regards,
Mike


--
*方鍾豪 (Mike Fang)*
Pervasive Embedded Technology Lab
Department of Computer Science, National Chiao Tung University

Attachment: Test.scala
Description: Binary data

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

import scala.*;
import scala.collection.immutable.Range;
import scala.runtime.*;

public class Test
{

public int mulOneAtTime(int x, int y)
{
return x * y;
}

public void until(Function0 condition, Function0 block)
{
if(!condition.apply$mcZ$sp())
{
block.apply$mcV$sp();
until(condition, block);
}
}

public int test_until()
{
IntRef x = new IntRef(10);
until(new Serializable(x) {

public final boolean apply()
{
return apply$mcZ$sp();
}

public boolean apply$mcZ$sp()
{
return x$3.elem == 0;
}

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

public static final long serialVersionUID = 0L;
private final IntRef x$3;

public
{
this.x$3 = x$3;
super();
}
}, new Serializable(x) {

public final void apply()
{
apply$mcV$sp();
}

public void apply$mcV$sp()
{
x$3.elem = x$3.elem - 1;
Predef$.MODULE$.println(BoxesRunTime.boxToInteger(x$3.elem));
}

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

public static final long serialVersionUID = 0L;
private final IntRef x$3;

public
{
this.x$3 = x$3;
super();
}
});
return mulOneAtTime(6, 7);
}

public Test()
{
RichInt$.MODULE$.to$extension0(Predef$.MODULE$.intWrapper(1),
9).reduceLeft(new Serializable() {

public final int apply(int x$1, int x$2)
{
return apply$mcIII$sp(x$1, x$2);
}

public int apply$mcIII$sp(int x$1, int x$2)
{
return x$1 * x$2;
}

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

public static final long serialVersionUID = 0L;

});
}
}

Other related posts:

  • » [trend_fp] [Scala反組譯小幫手] Higher Order Function - 方鍾豪