<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="ja"> 
  <HEAD>
    <title>Akihito Nagata's Page</title> 
    <link rel="stylesheet" href="stylesheet.css" type="text/css">
    <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
     <META http-equiv="Content-Style-Type" content="text/css">
    <meta name="robots" content="all">
     <LINK rel="INDEX" href="./index.html">
  </HEAD>
  <body>
    <h1>Main Sections</h1>
    <h2>Scheme to Java</h2>
    Schemeをjavaのコードに変換する。
    対象言語をcore schemeとする。<br>
    <h2>box化とunbox化</h2>
    Schemeのコードを安全に実行するためには,ダイナミック型チェックシステムを実装しなくてはならない。これを実現するにはSchemeのオブジェクトに型情報を付加することが必要となる。Schemeにおける型情報をJava言語でclassの型システムを利用して実装する。Schemeのオブジェクトはそのクラスのインスタンスとする。Number型,Boolean型でそれぞれに対応したクラスが割り当てられ、そしてオペレータを適用する際に内部のデータを取出し演算を行うことにする。もし演算を適用する型が異なれば内部のデータを取出すことができず例外が発生する。<br>
    しかし例えばNumber型とBoolean型を表すJava Classが異なれば両者を同様に受け渡しすることはできない。これらを同じように受け渡しするには基底クラスを設定する必要があり、Schemeのオブジェクトを全てそれの派生クラスのインスタンスとして扱えばよい。<Br>

そこでScmObjを基底クラスとして設定し、Java上ではSchemeのオブジェクトはScmObjとして受け渡しを行う。
    ScmObjのままではプリミティブの演算を適用することはできないが、演算を適用する直前に目的のクラスへダウンキャストを行い目的のクラスへ型変換することにより型チェックとオペレータの実行が行われるようにする。
演算が実行された後は得られた結果をまたScmObjのインスタンスへと変換することでまた型の情報を付加することができる。

    <h2>Core Schemeに必要なJavaのクラス</h2>
    <ul>
      <li>ScmObj : 全てのSchemeのオブジェクトの基底クラス。これによりデータの受け渡しが行われる。このクラスはSchemeのオブジェクトをbooleanとして評価するためのメソッドを持っている。SchemeではBoolean型として評価した場合,#f以外は全てtrueを返すのでこのメソッドの返り値は常にtrueである。#t,#fの場合はScmBoolによりこのメソッドはオーバーロードされる。</li>
      <li>ScmNum : Schemeのnumber型を表すクラス。メソッドevalNumにより内部のデータを取出す。SchemeのNumber型は複雑な機能を持っているがこれの正確な実装はfuture workとしここでは内部にJavaのdouble型を代わりに持たせることにする。</li>
      <li>ScmBool : Schemeのboolean型。ScmObjのevalBoolをオーバーロードする。</li>
    </ul>
    <h3>手続き型</h3>
    Schemeは手続きも他のオブジェクトと同様に引数による受け渡しができる(first-class value)。よって手続き型もScmObjの派生クラスである必要がある。<br>
    この条件を満たすにはSchemeの手続きはJavaの単なるメソッドでは置き換えることができないことがわかる。手続きもクラスのオブジェクトでなければならない。<br>
    またSchemeでは関数適用により異なる数の引数が適用されていても、コンパイル時にはエラーにならない。実行時に適用される際に適用できるかどうかを調べてできないとわかった場合に初めてエラーを検出する。<br>
    そのためには手続きは見かけ上、実際のsigniture以外のものも持っている必要がある。
    手続きの適用を行う際にはその手続きのsignitureを確かめる必要がある
    Javaでこの機能を実装するには手続きには単一の手続き型を持たせるのではなく手続きごとに異なるインタフェースを実装し、関数適用を行うときに適用しているsignitureをもつインタフェースへとキャストすることにより適用する関数のsignitureのチェックを行う。手続き以外のオブジェクトにはこれらのインターフェースは実装されていないのでこれは同時に手続き型のチェックにもなっている。<br>
    <h3>手続きからclassへの変換。</h3>
また内部のメソッドは手続きにつき異なるメソッドを呼び出さなければならないので手続きとクラスを対応させる。<br>
    上でも述べたようにSchemeの手続きとJavaのmethodは機能的に異なる部分がある。First classである点と型検査を動的に行う点は上記で解決したが、まだ解決していない機能として局所関数定義がある。<br>
    <h4>closure</h4>
よって手続き内部で定義された変数は内部で定義される手続きから参照される可能性があるので、それを表すクラスがmember変数として持っておく必要がある。
また手続き内で参照されている変数がその手続き内で定義された変数では無い場合、それは外部の手続きで定義された変数であり、それにアクセスするためには外部のクラスのインスタンスにアクセスできなければならないので、変換する手続きよりも外部で定義されている全ての手続きのインスタンスをメンバ変数として持っておく必要がある。
こうすることによりそのインスタンスのメンバ変数としてその変数にアクセスすることができる。
    
    <br>
    手続きにはその手続きが持つ型を表すインターフェースを定義し、それをimplementする。例えばFibonattiならばnum -> num であるが、これを int app(int i)をsignitureとして持つインタフェースIiを定義し、クラスFibonattiにこれを持たせる。またFibonattiはScmObjの子クラスとしScmObjとして受け渡しが可能にする。<br>
    手続き内で定義される変数は内部で定義される関数により参照または書き換えられる可能性がある。java のclassに変換する際にメンバ変数として持つようにする。
    <h3>関数適用</h3>
    関数を適用する際に今から適用しようとするsignitureを持つインターフェースにキャストする。これにより動的型チェックを実現する。
    Java上でのメソッド名は統一してappにする。本来スタックに積むべき変数を格納する領域をメンバ変数として持っているため呼び出すときには新に領域を確保する必要がある。よってcloneメソッドを実装しておき関数を適用する際には必ずcloneを作り出すようにする。
  </body>
</html>

 
