2013-06-20 91 views
26

我對功能語言的Android編程感興趣,最好接近Haskell。 Frege似乎是一個不錯的選擇。我發現有人已經做了這樣的proof-of-concept application,但我找不到它的來源或類似的東西。如何在Android上運行Frege程序?

所以我的問題是,如何在Android上運行Frege程序,它有多困難以及最終的障礙是什麼?

+1

我的猜測是,它會讓人想起斯卡拉編寫Android應用程序所需要的工作,只要這兩個編譯成字節碼的JVM。 – CommonsWare

+2

在這裏搜索或詢問:https://groups.google.com/forum/#!forum/frege-programming-language – Landei

+1

請注意您需要構建您自己的JDK6友好的frege編譯器,以下是一些提示https: //github.com/Frege/frege/wiki/Frequently-Asked-Questions – Ingo

回答

3

我不熟悉frege,並且我還沒有嘗試過在Android上使用scala或其他JVM語言。這就是說,如果我想嘗試這樣的事情,那麼這些步驟我可能會嘗試並找出如何使其工作。

  1. 在frege中構建一個簡單的基於命令行的HelloWorld類型應用程序,可以使用例如, java -jar HelloWorld.jar HelloWorld

  2. 在HelloWorld.jar上運行dx,然後嘗試使用dalvikvm獲取使用adb shell處理android設備的示例。即dalvikvm -cp blah.dex的HelloWorld

  3. 圖如何從被Android SDK在弗雷格

  4. 提供的引用的android.jar /使用的類建立在弗雷格概念Activity類的簡單的證明,並手工打造從中

  5. 構建概念應用的類似證明一個classes.dex文件在Java中,並使用現有的Android工具構建的APK

  6. 在APK替換classes.dex,辭職的APK,並看看它是否有效

  7. 如果你有這麼多的工作,那麼從那裏開始,你可以使用aapt來編譯資源,並最終構建一個完整的「從頭開始」的apk文件。

+0

如果您想在Android上嘗試Scala,請使用Scala-IDE;它具有在Android上執行Scala的特定文檔。 –

6

我看到的主要障礙是目前無法將frege源編譯爲實現某個接口或擴展另一個類的java類。

相反,從frege模塊生成的java類只是您定義的靜態方法和其他東西的命名空間。

因此,爲了製作一個比平凡的Android項目,它不足以從frege調用java,這很容易,但也可以從java調用frege。換句話說,你將需要字面意義上的全部* inter *可操作性。

當然,這是可以做到的,但必須說的是,代碼生成並不是爲了方便使用java而設計的。

我還沒有完成一個Android項目,因此我不確定需要多少膠水代碼。

最後一個警告:加布裏埃爾裏巴先前的工作是使用早期版本的編譯器完成的。甚至還有一個指向支持JDK6的frege發行版的鏈接 - 請不要使用它,它與更新的版本不兼容。

如果你仍然願意接受它,你會通過上面提到的谷歌組得到一切可能的支持。如果有人制作並記錄了一些「規範」的方法來實現這一點,那就太棒了。

+0

這個答案現在已經過時,請參閱https://ingo60.gitbooks.io/frege-quick-reference/content/modules.html#_integration_with_other_jvm_languages –

2

從我能從快速網頁搜索中收集到的一切,包括frege - 編程語言郵件列表中的一些命中,它看起來不像是隻有Frege的Android應用程序是可能的。

取而代之,您必須採用其他支持Android的語言,並使用它來調用您的Frege代碼。生成這樣的「存根」可能會自動完成,但我沒有看到現有的工具。

還有一些關於由Frege和Java編譯器爲Android生成的Java代碼的問題,但這似乎是使用逆向轉換工具相對容易解決的問題。

https://groups.google.com/forum/#!topic/frege-programming-language/Ounzmu-oHJQ https://groups.google.com/forum/#!topic/frege-programming-language/8bkWorojiiY

我也希望有指稱透明,強類型與兩個參數多態性和可用做Android開發特設多態的語言。雖然缺少這些,但我推薦Scala進行Android開發。

+0

只是爲了記錄,Scala既有參數多態性也有可用的特殊多態性今天,就像Haskell/Frege一樣,雖然語法不太好。 –

+0

Scala不透明,+ Erik Allik。除此之外,它符合我的標準,即使是「won」「特設多態性。 (說實話,Haskell的類型系統是好的,但它也有點笨拙。) –

+0

你的意思是沒有強制的參照透明度。是的,我希望我主要是Scala類型的語義,主要是Haskell的語法,這是我認爲Haskell領導的地方。 –

2

如果你想完全在弗雷格編寫你的應用程序,那會更棘手。您需要爲Android API編寫包裝,因爲FregeAndroid wrapper似乎是missing some files。然而,如果你想用Java編寫你的UI,併爲你的應用程序邏輯調用Frege,我有一個sample project,它顯示瞭如何做到這一點。

我的示例項目在弗雷格這樣的功能:

extraText :: String -> String 
extraText who = "\nHello, " ++ who ++ "!" 

然後我從Java調用:

public class FregeActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView textView = (TextView) findViewById(R.id.txt); 
     textView.append(FregeCode.extraText("Android")); 
    } 
} 

它看起來像這樣

FregeActivity

我的示例項目使用Frege 3.23,所以你會使用old way of calling Frege from Java。我還沒有嘗試過使用Frege 3.24,但是如果你想嘗試,你可以使用the new way

唯一真正棘手的部分是得到一個build.gradle將建立弗雷格代碼。我開始在弗雷格郵件列表中輸入snippet posted by Andreas Ländle,然後我將它充實到a complete build.gradle。我無法使用Proguard工作,所以最終的APK包含整個frege.jar。這使得應用程序膨脹了一點,它需要打開Multidex,但否則它似乎很好。

此外,請注意,我的示例項目需要API Level 21或更高版本,因爲Frege需要ForkJoinPool,Android僅在21級及以上。

1

對於任何人仍然感興趣,我有一篇關於它的博客文章here。您必須設置您的gradle build來將Frege代碼編譯爲java並將其放入您的java源代碼路徑中。然後,你必須繼承的活性和efine一些定製包裝

data Bundle = native android.os.Bundle 

data Context = native android.content.Context 

data FregeActivity = native android.app.Activity where 
    native getApplicationContext :: MutableIO FregeActivity -> IO (MutableIO Context) 
    native setContentView :: MutableIO FregeActivity -> MutableIO TextView -> IO() 

data TextView = native android.widget.TextView where 
    native new :: MutableIO Context -> STMutable RealWorld TextView 
    native setText :: MutableIO TextView -> String -> IO() 

onCreateF :: MutableIO FregeActivity -> IO() 
onCreateF !this = do 
    context <- this.getApplicationContext 
    tv <- TextView.new context 
    tv.setText "Hello, Android - Love, Frege" 
    this.setContentView tv 

native module type FregeActivity where { 
    @Override 
    public void onCreate(android.os.Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final frege.run7.Func.U<Object,Short> res = RunTM.<frege.run7.Func.U<Object,Short>>cast(onCreateF(this)).call(); 
     frege.prelude.PreludeBase.TST.run(res).call(); 
    } 
} 
+0

鏈接現在已經死了,你能檢查一下嗎? –

+0

我會把它放回去。這是一個更新的和有用的貢獻: https://github.com/mchav/froid –

相關問題