class HelloWorld { static Void main() { echo("Hello, World!") } }
移æ€æ§
Fantomãäœæããäž»ãªçç±ã¯ã2ã€ã®Java VMããã³.NET CLRãã©ãããã©ãŒã ã§å®è¡ã§ãããœãããŠã§ã¢ãæžãããšã§ããã çŸå®ã«ã¯ãã»ãšãã©ã®äŒæ¥ããããã®ãã©ãããã©ãŒã ã®ããããã§ãœãããŠã§ã¢ãéçºããŠããŸãã PythonãRubyãªã©ã®åçèšèªã§ããããããã®ä»®æ³ãã·ã³ã®ããããã§å®è¡ãããŸãã Fantomã¯ãããä»®æ³ãã·ã³ããå¥ã®ä»®æ³ãã·ã³ãžã®ç§»æ€æ§ã®åé¡ã解決ããããã«äœæãããŸããã Fantomã®ãœãŒã¹ã³ãŒãã¯fcodeïŒJavaãã€ãã³ãŒããŸãã¯ILã«ç°¡åã«å€æã§ãããã€ãã³ãŒãïŒã«ã³ã³ãã€ã«ãããŸãã ãããŒããã£ã¹ãã¯å®è¡æã«è¡ãããŸããããã«ãããFantomã¢ãžã¥ãŒã«ãåå¥ã®ãã¡ã€ã«ãšããŠå±éããä»»æã®VMã§å®è¡ã§ããŸãã
移æ€æ§ãšã¯ãåãªãJavaã.NET以äžã®ãã®ãæå³ããŸãã åè¿°ã®ããã«ãFantomã¯ãã©ãŠã¶ãŒã§åäœããããã«JavaScriptã§ã³ã³ãã€ã«ã§ããŸãã åæã«ãFantomã¯ããã§åæ¢ããã€ããã¯ãããŸããã次ã®ç®æšã¯ãObjective-C for iPhoneã LLVM ã Parrotã§ãã
ãšã¬ã¬ã³ããªAPI
圌ãã¯å¥œã¿ã«ã€ããŠè°è«ããŸãããïŒçŸããã¯èŠã人ã®ç®ã«ãããŸãïŒãFantomã®äœæè ã¯çŸãã䟿å©ãªAPIã«å€¢äžã§ãã Fantomã®åºæ¬ååã®1ã€ã Javaãš.NETã«ã¯ãå°ããªç¬ç«ããæœè±¡åããããŠãããïŒã¯ã©ã¹ïŒãžã®æ©èœåå²ãæ倧åãããšããå ±éã®åŸåããããŸãã Fantomã«ã¯éã®å²åŠããããŸã-圌ãã¯ãå°æ°ãªãã匷åãªãŠãããã§ã§ãããšä¿¡ããŠããŸãã
è¯ãäŸã¯java.ioããã±ãŒãžã§ãããã«ã¯60以äžã®ã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ãŒã¹ãå«ãŸããŠããŸã; Fantomã§ã¯ãå¿ èŠãªãã®ã¯ãã¹ãŠFile ã Buf ã InStreamããã³OutStreamã«ãããŸãã ãããŠãããã¯ãã®äœ¿çšæ¹æ³ã§ãïŒ
Void textIO() { f := File(`text-io.txt`) // write text file (overwrites existing) f.out.printLine("hello").close // append to existing text file f.out(true).printLine("world").close // read text file as big string echo(f.readAllStr) // read text file into list of lines echo(f.readAllLines) // read text file, line by line f.eachLine |line| { echo(line) } }
ã¿ã€ãã³ã°
å šäžçãéçåãšåçåã®ãµããŒã¿ãŒã«åãããŠããŸãã Fantomã®äœæè ã¯ãåæ¹ãäºãã«éåžžã«æ¹å€çã§ãããšä¿¡ããŠãããäž¡è ã®äžéãéžæããŸããããã¯ãã¿ã€ãã³ã°ã·ã¹ãã ã«å¯ŸããäžçšåºŠã®ã¢ãããŒãã§ãã
éçåä»ãã®åŽé¢ãããFantomã¯åã®ãã£ãŒã«ããšã¡ãœããã·ã°ããã£ã®èª¬æãå¿ èŠãšããŸãã ã³ã³ããŒãã³ãéã®é信圢åŒãä¿®æ£ããããšããå§ãããŸãã ããšãã°ãæååãšæ°å€ã§æ©èœããã¡ãœãããäœæããå Žåãã³ãŒãã§çŽæ¥ä¿®æ£ããå¿ èŠããããŸãã ã¡ãœããããã£ãŒã«ãã®çœ²åã®éçãªåä»ããšã¯ç°ãªããã³ãŒãã§ã¯ãã°ãã°å¹²æžããã ãã§ãäžå¿ èŠãªã³ãŒããæžãããšãäœåãªããããŸãã Fantomã®åæšè«ã¯ãã®åé¡ãåé¿ããŸãã ããšãã°ãJavaã§ã®é¢åãªèŸæžã®äœæïŒ
Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "one"); map.put(2, "two");
Fantomã®1è¡ã«çžåœïŒ
map := [1: "one", 2: "two"]
ãã ããåçåä»ããæ¬åœã«å¿ èŠãªå ŽåããããããFantomã®äž»èŠãªæ©èœã®1ã€ã¯ãéçåãŸãã¯åçåä»ãã䜿çšããŠã¡ãœãããåŒã³åºãæ©èœã§ãã ãããæŒç®åã䜿çšããŠã¡ãœãããåŒã³åºããšãã³ã³ãã€ã©ã«ãã£ãŠåŒã³åºãããã§ãã¯ãããå¹ççãªãã·ã³ã³ãŒãã«ã³ã³ãã€ã«ãããŸãã
ãŸãã¯ãã->ãæŒç®åã䜿çšããŠåçåŒã³åºããæå®ã§ããŸãã å®éãã->ãã¯Obj.trapã®åŒã³åºãã«ãªãã€ã¬ã¯ããããŸãã ããã©ã«ãã§ã¯ããã©ããã¯ãããã®ããã«æ©èœããŸãããå®è¡æã®ã¿ã§ãã åçèšèšãå®çŸ©ããããšã«ããããã®åäœãå€æŽã§ããŸãã
if (a is Str) { return a->toInt } obj->foo // obj.trap("foo", [,]) obj->foo(2, 3) // obj.trap("foo", [2, 3]) obj->foo = 7 // obj.trap("foo", [7])
ãžã§ããªãã¯
èå³æ·±ãããšã«ãFantomã¯ã³ãŒãã®åä»ããå°ãªãããããšããŠããŸãããJavaãšCïŒã¯åä»ãã®åŒ·åã«åãã£ãŠããŸããããžã§ããªãã¯ã¯ãã®åŸåã瀺ããŠããŸãã å®å šã«ãã©ã¡ãŒã¿ãŒåãããã·ã¹ãã ã¯ãã·ã¹ãã ã®è€éãã«çŽæ¥é¢ä¿ãããããFantomã¯çŸåš ãå©çãšè€éãã®ãã©ã³ã¹ã暡玢ããŠããŸãã
Fantomã§ã¯çŸåšããžã§ããªãã¯ã®ãµããŒããå¶éãããŠããŸã-ãŠãŒã¶ãŒã¯èªåã®ãžã§ããªãã¯ã䜿çšã§ããŸããã ãã ãã3ã€ã®çµã¿èŸŒã¿ã¯ã©ã¹ã¯ListãMapãããã³Funcã§ãã ããšãã°ãFantomã®æŽæ°ã®ãªã¹ãã¯ãInt []ãšããŠå®£èšãããŸãã Fantomã®äœæè ã¯ã圌ããäžéã«ãããšä¿¡ããŠããŸãããžã§ããªãã¯ã¯ãããŸãããã·ã¹ãã ãè€éã«ããããšã¯ãããŸããã
äžçŽç©
ã¢ãã«ããµããžã§ã¯ãé åããã³ãŒãã«æ¯èŒããåé¡ã¯ããœãããŠã§ã¢éçºã§æãé »ç¹ã«è§£æ±ºãããåé¡ã®1ã€ã§ãã éåžžããªããžã§ã¯ãæåããã°ã©ãã³ã°ã§ã¯ããã®ãã¬ãŒãºã¯ã¢ããªã³ã°ã¯ã©ã¹ãšã€ã³ã¿ãŒãã§ã€ã¹ãæå³ããŸãã JavaãšCïŒã¯åãã¢ãããŒãã䜿çšããŸããã¯ã©ã¹ã¯åäžã®ç¶æ¿ããµããŒãããã€ã³ã¿ãŒãã§ã€ã¹ã¯è€æ°ã®ç¶æ¿ããµããŒãããŸãããå®è£ ã®ç¶æ¿ã¯ãµããŒãããŸããã
JavaãŸãã¯CïŒã䜿çšããããšããã人ãªã誰ã§ããã¯ã©ã¹ãŸãã¯ã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããšãéžæããããšãéåžžã«éèŠã§ããããšãç¥ã£ãŠããŸãã ã¯ã©ã¹ãéžæããå Žåãå®è£ ãç¶æ¿ããå¯äžã®ãã£ã³ã¹ã䜿çšããŠããããã§ãã 倧èŠæš¡ã§è€éãªã¢ãã«ã䜿çšããŠããå Žåãã€ã³ã¿ãŒãã§ãŒã¹ã¯è¿œå ã®è² æ ã«ãªããŸãã ããšãã°ãçžç¶äººãç°ãªããåãã€ã³ã¿ãŒãã§ã€ã¹ãçããå®è£ ãã2ã€ã®ãªããžã§ã¯ããããå Žåãæ©èœãè€è£œããå¿ èŠããããŸãã è€è£œã«å ããŠããã¹ãŠã®å®è£ ã«åœ±é¿ããã€ã³ã¿ãŒãã§ãŒã¹ã®ããŒãžã§ã³ãå€æŽããåé¡ããããŸãã
JavaãšCïŒãã¯ã©ã¹/ã€ã³ã¿ãŒãã§ãŒã¹ã¢ãã«ã䜿çšããçç±ã¯ãããããããŸãã å€éç¶æ¿ã¯å€ãã®æãéããŸãããããã¯è€éãã®å¢å€§ãšãããäžå¿«ãªãã¥ã¢ã³ã¹ã®ããã«èµ·ãããŸãã Fantomã¯åã³mixinsãšåŒã°ããäžå€®ãå ããŸãã äžçŽç©ã¯ãå®è£ ãä¿åã§ããã€ã³ã¿ãŒãã§ã€ã¹ã§ãã å€éç¶æ¿ãšã©ãŒãåé¿ããããã«ããã£ãŒã«ããä¿åããç¶æ ãªã©ã®äžéšã®é¢æ°ã¯ãäžçŽç©ãå¶éãããŠããŸãã äžçŽç©ã®äŸïŒ
mixin Audio { abstract Int volume Void incrementVolume() { volume += 1 } Void decrementVolume() { volume -= 1 } } class Television : Audio { override Int volume := 0 }
èå³ãããã°ãJavaã®åçç©ãããã§èŠãããšãã§ããŸã ã
ã¢ãžã¥ãŒã«æ§
ã¢ãžã¥ãŒã«æ§ã¯ãçŸä»£ã®ããã°ã©ãã³ã°èšèªãå¿ èŠãšãããœãããŠã§ã¢ã®éèŠãªåŽé¢ã§ãã
æ®å¿µãªããšã«ãJavaã®éå»10幎éãç§ãã¡ã¯classpathã§æ¬åœã®å°çãçµéšããŠããŸããã classpathã®åé¡ã«å ããŠãjavaã¯ééã£ã決å®ãäžãããµã€ãºã44Mbã®J2SEã¢ããªã¹ã«åãæ¿ããŸãããããã«ãããã¢ããªã±ãŒã·ã§ã³ãå€§å¹ ã«é ããªããŸããã
.NETã¯ãã®åé¡ãéåžžã«æ·±å»ã«åãæ¢ããŠãããããããŒãžã§ã³ã¡ã«ããºã ãGACãããã³ãã®ä»ã®ããŒã«ã®ãããã§ãJavaã®åé¡ã®äžéšã解決ãããŸããã ãããã圌ãã¯zipã¢ãžã¥ãŒã«ã®ã·ã³ãã«ãã倱ãããŸã å€ãã®ç°ãªãã¹ãã¢ããŒããå«ãDLLã«ã¢ãžã¥ãŒã«ãããã¯ãå§ãããããã¢ãžã¥ãŒã«ã§ã®äœæ¥ãå°é£ã«ãªããŸããã
Fantomã§ã¯ããã¹ãŠãããããšåŒã°ããã¢ãžã¥ãŒã«äžã«æ§ç¯ãããŸãã javaã®å Žåãšåæ§ã«ãunderã¯ç°¡åã«ç¢ºèªã§ããzipãã¡ã€ã«ã§ãã ã¡ã¿ããŒã¿ã¯ç¹å¥ãªãã¡ã€ã«/meta.propsã«ä¿åãããŸããããã¯ãpod.nameãpod.versionãpod.dependsãªã©ã®ããŒãšå€ã®ãšã³ããªã§ãã ãããã®äŸåé¢ä¿ã¯ãã®ã¡ã¿ããŒã¿ã«ä¿åãããæ瀺çã§ç解å¯èœãªæ¹æ³ã§èšè¿°ãããŸãã
Javaã®åå空éã§ã³ãŒããæŽçããã«ã¯ãããã±ãŒãžã䜿çšãããjarãã¡ã€ã«ã¯ã¢ãžã¥ãŒã«ãšèŠãªãããŸãã ãããã®æŠå¿µã®äžäžèŽã¯å€§ããªåé¡ãåŒãèµ·ãããŸãã javaã¯ã©ã¹ã®ååã¯ãããŸããããã®ã¯ã©ã¹ãã©ã®jarãã¡ã€ã«ã«ååšããã©ãããããŒããããã¯ããããŸããã
Fantomã¯ããpod :: type.slotããšããååã®3ã€ã®éå±€ã¬ãã«ãã€ãŸã æåã®ã¬ãã«ã§ã¯ãåžžã«ãããã®ååã次ã«ã¿ã€ãåïŒjavaã®Classã®ã¢ããã°ïŒã次ã«ã¹ãããã®ååïŒã¡ãœãããŸãã¯ãã£ãŒã«ãïŒã åå空éã§ã®ãã®äžè²«ããåäœã«ããã倧èŠæš¡ã·ã¹ãã ã®ã¢ã»ã³ããªããã»ã¹ãç°¡åã«å¶åŸ¡ã§ããŸãã
é¢æ°åããã°ã©ãã³ã°
JavaãšCïŒã¯ã¯ããŒãžã£ãŒã®å®å šãªãµããŒãã«åãã£ãŠããŸãããããèªäœã¯å€ãAPIãšããŠã®æŽå²ã«å€§ããªè¶³è·¡ãæ®ããŠããŸãã Fantomã¯ãåæ段éã§ééããµããŒãããŠäœæãããŸããã ã¯ããŒãžã£ã¯ãããããå Žæã§åžžã«äœ¿çšãããèšèªã®éèŠãªæ©èœã§ãã
// print a list of strings list := ["red", "yellow", "orange"] list.each |Str color| { echo(color) } // print 0 to 9 10.times |i| { echo(i) } // create a function that adds two integers add := |Int a, Int b->Int| { return a + b } nine := add(4, 5) // map Int to Str map := [0:"zero", 1:"one", 2:"two"] // empty Int:Str map Int:Str[:] // map [1, 2, 3].map { "f" + it * 2 } // ["f2", "f4", "f6"] //reduce ["2":2, "3":3, "4":4].reduce(0) |Int sum, Int v->Int| { sum + v } // 9
宣èšçãªèª¬æ
æè¯ã®èª¬æã¯ãããã€ãã®äŸã§ãã
Window { title = "Example" size = Size(300, 200) content = EdgePane { center = Label { text = "Hello world"; halign = Halign.center } bottom = Button { text = "Close"; onAction.add { it.window.close } } } }.open homer := Person { name = "Homer Simpson" age = 39 children = [ Person { name = "Bart"; age = 7 }, Person { name = "Lisa"; age = 5 }, Person { name = "Maggie"; age = 1 } ] }
䞊è¡æ§
çŸåšãã»ãšãã©ã®èšèªã«ã¯ãã¹ã¬ããéã§1ã€ã®å ±éã¢ãã«ããããŸãã ããã¯ãéçºè èªèº«ãã¡ã¢ãªããã¯ãåŠçããå¿ èŠãããããšãæå³ããŸãã äžæ£ãªãããã¯ã¯ããããããã¯ã競åç¶æ ãªã©ã®äžå¿«ãªãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã ããã¯ãã¹ãŠã䞊è¡æ§ç®¡çã«ãšã£ãŠããªãäœãã¬ãã«ã§ãã
Fantomã¯ã次ã®ææ³ã䜿çšããŠäžŠè¡æ§ããµããŒãããŸãã
- äžå€ãªããžã§ã¯ã ïŒã¹ããªãŒãã³ã°ã»ãã¥ãªãã£ïŒ
const class Point { new make(Int x, Int y) { this.x = x; this.y = y } const Int x const Int y } p := Point(0, 0) // ok px = 10 // throws ConstErr vowels := ['a','e','i','o','u'].toImmutable
- éçãã£ãŒã«ãã¯äžå€ãªããžã§ã¯ãã®ã¿ãä¿åã§ãããããç°ãªãã¹ã¬ããã¯å ±æãããå¯å€ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸããã
- ã¹ã¬ããéã®éä¿¡çšã®ã¡ãã»ãŒãžã¢ãã« ïŒã¢ã¯ã¿ãŒïŒïŒErlangã¹ã¿ã€ã«ïŒ
echo("\n--- echoActor ---") // this actor just echos messages sent to it a := Actor(ActorPool()) |msg| { echo(msg); return msg } // send some messages and have them printed to console f1 := a.send("message 1") f2 := a.send("message 2") f3 := a.send("message 3") // now block for the result of each message echo("Result 1 = " + f1.get) // message 1 echo("Result 2 = " + f2.get) // message 2 echo("Result 3 = " + f3.get) // message 3
æ§æç³
- ãªãã·ã§ã³ã®ããã©ã«ãå€
class Person { Int yearsToRetirement(Int retire := 65) { return retire - age } Int age }
- åæšè«-ããŒã«ã«å€æ°ã®åãæšæž¬ã§ããŸã
- æé»çãªãã£ãŒã«ãã¢ã¯ã»ã¹
class Thing { Int id := 0 { get { echo("get id"); return &id } set { echo("set id"); &id = it } } }
- ãŒãå -å€ãšããŠnullãåãå
¥ããããªãåãããã³åãå
¥ããããåãžã®åã®åé¢ã
Str // never stores null Str? // might store null x := str.size => x is typed as Int x := str?.size => x is typed as Int?
- CïŒ Anders Hejlsbergã§ããã§ãã¯äŸå€ãåé€ããããããã¯æå¹ã«ãªããŸããã§ããïŒãããŠæ£ããå®è¡ãããŸããïŒã
- æ°å€ç²ŸåºŠ-64ãããIntããã³FloatãµããŒãã®ã¿
è³æº
- Fantom EclipseããŒã¹ã®IDE F4
- Webã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã®ç©èª
//Hello world written in tales using tales class HelloWorld : Page{ @Route{uri="/hello-world"} Void main(){ response.writeStr("Hello World") } }
- ããžãã¯ããªãŒã®ãã³ãã¬ãŒããšã³ãžã³Moustache
using mustache Mustache template := Mustache("Hello, {{ name }}!".in) template.render(["name":"world"])
- Fantom Podãªããžããª
- fantom.org
ãããã«
ããããééãã¯ãFantomãJavaã®ãã1ã€ã®æ¹è¯ããŒãžã§ã³ã§ããããšã§ãã ãããããã®é åããã¹ãŠç解ãå§ãããšããããç¬èªã®å²åŠãšæŠå¿µãæã€èšèªãšããŠèŠãã ãã§æžã¿ãŸãã Fantomã«ã¯ãå®å®æ§ã«å ããŠã ãã¬ã³ããªãŒã³ãã¥ãã㣠ãå®å šã«ãªãŒãã³ãœãŒã¹ã®ã³ãŒã ãããŠããªIDEãªã©ãå€ãã®å¿«é©ãªæ©èœãªã©ã®å€ãã®æ©èœãå«ãŸããŠããŸãã