Fennel āļืāļāļัāļāļีāļĨ้āļāļĄāļāļĢัāļāļŦāļ้āļēāļāļēāđāļ็āļāļāļĒ่āļēāļāđāļĢāļŦāļēāļูāđāļāđāļ็āļāđāļ้āļŠāļĄัāļĒāļี้āđāļĨ้āļ§ ( āļāļĄāđāļāļāļ็āđāļĄ่āļĢู้āļัāļ 555 ) āļ้āļēāļ§āđāļĨ้āļ§āļāļ°āļูāļāļึāļāļāļģāđāļĄ āļืāļ Fennel āļี่āļāļĄāļูāļāļึāļāļี่āđāļĄ่āđāļ่āļืāļāļัāļāļāļĢัāļāđāļ่āđāļ็āļāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļŦāļึ่āļāļึ่āļāđāļĄื่āļāđāļีāļĒāļāđāļĨ้āļ§āļāļ°āđāļāļĨāđāļ็āļāļ āļēāļĐāļē Lua āļีāļāļีāđāļĨ้āļ§āļĢัāļāļ้āļ§āļĒ LuaVM āļัāļāļั้āļāđāļāļĢื่āļāļāļี่āļāļ°āđāļĨ่āļāđāļ้āļē Fennel āđāļ้āļึāļāļ้āļāļāļĨāļ Lua āđāļ§้āļ้āļ§āļĒ
āđāļĨ้āļ§āļāļ°āđāļ้āđāļāļāļģāđāļĄāđāļีāļĒāļ Lua āđāļāđāļĨāļĒāđāļĄ่āļีāļāļ§่āļēāļŦāļĢืāļāļ่āļēāļĒāļāļĒู่āđāļĨ้āļ§ āļู้āļŠāļĢ้āļēāļāļ āļēāļĐāļēāđāļāļēāđāļีāļĒāļāļี่āļĄāļēāļี่āđāļāđāļ§้āđāļĨ้āļ§āđāļ่āļ้āļēāļāļ°āđāļŦ้āļāļĄāļāļāļāļ็āļืāļāđāļื่āļāļāļģāđāļāļŠิ่āļāļี่ Lua āļāļģāđāļ้āđāļ่āļĒุ่āļāļĒāļēāļāđāļŦ้āļŠāļ°āļāļ§āļāļึ้āļāļ่āļēāļĒāļึ้āļ āđāļ่āļāļ āļēāļĐāļē MoonScript/YueScript āļี่āļāļĢัāļ syntax āđāļŦ้āļāļĢāļ°āļัāļ āđāļีāļĒāļāđāļāļ OOP āđāļ้āļŠāļ°āļāļ§āļāļึ้āļ āļัāļāļāļēāļĢāļัāļ table āđāļ้āļ่āļēāļĒāļึ้āļ āļŦāļĢืāļāļāļēāļĢāļĨāļāļ้āļāļิāļāļāļĨāļēāļāđāļāļāļēāļĢāđāļีāļĒāļāđāļāļĢāđāļāļĢāļĄāļāļĒ่āļēāļāđāļ่āļāļ āļēāļĐāļē Teal āļี่āđāļ็āļ Lua āđāļāđāļāļāļี่āļĄีāļāļēāļĢāļāļģāļŦāļāļ type āļāļāļāļัāļ§āđāļāļĢāđāļŦ้āļัāļāđāļāļāđāļ็āļāļ้āļ
āļĄāļēāļĢู้āļัāļāļัāļ Fennel
Fennel āđāļ็āļāļ āļēāļĐāļēāđāļิāļāļิāļāļāļ์āļี่āļĄี syntax āđāļāđāļāļāļāļāļāļ āļēāļēāļĐāļē Lisp āđāļ่āļŠāļĢ้āļēāļāđāļŦ้āļĄีāļāļ§āļēāļĄāđāļ้āļēāļัāļāđāļ้āļัāļ Lua āļāļģāđāļŦ้āđāļĄ่āļ้āļāļāđāļāļĨี่āļĒāļāļ§ิāļีāļāļēāļĢāđāļีāļĒāļāļĄāļēāļāļัāļāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāđāļĢีāļĒāļāđāļ้ standard library āđāļĨāļ°āļĄāļāļูāļĨāļ่āļēāļāđ āļāļāļ Lua āđāļ้āđāļāļĒāļāļĢāļāđāļĨāļ°āđāļāļāļēāļāļāļĨัāļāļัāļāļ็āļŠāļēāļĄāļēāļĢāļāđāļĢีāļĒāļāđāļ้āļĄāļāļูāļĨāļี่āđāļีāļĒāļāļ้āļ§āļĒ Fennel āđāļ Lua āđāļ้āđāļ่āļāļัāļ āļึ่āļāļ่āļēāļāļ āļēāļĐāļēāđāļāļ§ Lisp āļี่āđāļāļĨāļāđāļ็āļ Lua āļัāļ§āļื่āļāļāļĒ่āļēāļāđāļ่āļ Urn āļี่āļĄีāļāļ§āļēāļĄāđāļ็āļ Lisp āļĄāļēāļāļāļ§่āļēāđāļĨāļ°āļĄีāļĄāļāļูāļĨāđāļ็āļāļāļāļāļัāļ§āđāļāļ
āđāļāļĒāļŠ่āļ§āļāļัāļ§āđāļĨ้āļ§āļāļĄāļ§่āļē Fennel āđāļ็āļ Lisp āļี่āđāļĢีāļĒāļāļĢู้āļ่āļēāļĒāđāļāļĢāļēāļ° minimal āđāļŦāļĄืāļāļ Lua āđāļĄ่āļ้āļāļāļāļāļāļģāļāļģāļŠั่āļāļĄāļēāļāļĄāļēāļĒ āļึāļāļāļ°āđāļ้āļāļ āļēāļĐāļēāđāļิāļāļัāļāļ์āļัāļāđāļ็āļāļŦāļĨัāļāđāļ่āļ็āļŠāļēāļĄāļēāļĢāļāđāļ้āđāļāļĢāļāļŠāļĢ้āļēāļāļ้āļāļĄูāļĨāļี่āļัāļāļ้āļāļāļĄีāļāļēāļĢāļูāļ metatable āļāļģāđāļ็āļ OOP āđāļŦāļĄืāļāļ Lua āđāļ้ āļŠāļēāļĄāļēāļĢāļāđāļ้āļĨูāļāđāļāļāļēāļĢāļัāļāļāļēāļĢāļัāļ table āđāļ้ āđāļ้āļēāļึāļāļŠāļĄāļēāļิāļāđāļ table āđāļāļ Lua āđāļ่āļ (table.key) āļัāļ (table:method) āļŦāļĢืāļāđāļāļ Lisp āđāļ่āļ (. table key) āļัāļ (: table method) āļ็āđāļ้
āļ้āļāļีāđāļĄื่āļāđāļีāļĒāļāļัāļ Lua
- āļĄี option --compile-binary āđāļāļĨāļāđāļ็āļāđāļāļĨ์āđāļāļāļēāļĢี่āļี่āļŠāļēāļĄāļēāļĢāļāļĢัāļāđāļāļĢāđāļāļĢāļĄāđāļ้āđāļāļĒāļāļĢāļ āđāļĄ่āļ้āļāļāļāļēāļĻัāļĒāđāļāļĢื่āļāļāļĄืāļāļ่āļ§āļĒāđāļāļĨāļāđāļāļĨ์āļัāļ§āļื่āļ
- āđāļื่āļāļāļāļēāļāļ้āļāļāđāļāļĨāļāđāļ็āļ Lua āļ่āļāļāļāļģāļāļēāļāļึāļāļŠāļēāļĄāļēāļĢāļāļāļĢāļ§āļāļŠāļāļāļāļ§āļēāļĄāļูāļāļ้āļāļāđāļāļĢāđāļāļĢāļĄāđāļāļั้āļāļāļāļāļāļēāļĢāđāļāļĨāļ่āļāļāđāļ้
- āļŠāļēāļĄāļēāļĢāļāļāļģ macro āđāļื่āļāļāļĢัāļāđāļ่āļāđāļāļĢāđāļāļĢāļĄāđāļāļั้āļāļāļāļāļāļēāļĢāđāļāļĨāļāđāļ้
(macro += [x n] '(set ,x (+ ,x ,n))) (var a 1) (+= a 2) ; āđāļĢีāļĒāļāđāļ้āļĄāļēāđāļāļĢāđāļāļāļāļāļāļāļĄāđāļāļĨ์āļāļ°āđāļāļĨāļāđāļ้āļāđāļŦ้āđāļŦāļĄืāļāļāļัāļ (set a (+ a 2)) (print a) ; āđāļ้ 3 ( a == 1 + 2 == 3 )
- āļĄีāļāļ§āļēāļĄāļัāļāđāļāļāļāļ§่āļē Lua āļ้āļāļāļัāļāļāļ§āļēāļĄāļŠัāļāļŠāļāļ่āļ§āļĒāļĨāļāļ้āļāļิāļāļāļĨāļēāļāđāļ้āļีāļāļ§่āļē
- āļĄีāļัāļ§āđāļāļĢāļั้āļāđāļāļ mutable āđāļĨāļ° imutable
- āļĄีāļāļēāļĢāđāļĒāļ table āđāļāļāļีāļĒ์āđāļ็āļāđāļĨāļāļĨāļģāļัāļāđāļ็āļ array āđāļ้āļŠัāļāļĨัāļāļĐāļ์āđāļ็āļ [ ] āļ่āļēāļāļัāļ table āļี่āđāļ้ { }
- āļĄี lambda āļี่āđāļ็āļāļัāļāļ์āļัāļāļี่āļĄีāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļģāļāļ§āļāļāļēāļĢ์āļิāļ§āđāļĄāļāļ์āļัāļāļāļēāļĢāļēāļĄิāđāļāļāļĢ์āđāļŦ้āļāļĢāļāļัāļ
- operator āđāļ็āļāđāļāļ prefix āļāļģāđāļŦ้āđāļ้ operator āļัāļ§āđāļีāļĒāļ§āļัāļāļ้āļāļĄูāļĨāļŦāļĨāļēāļĒāļัāļ§āđāļ้āđāļ่āļ
>>(+ 2 3 5) ; āđāļีāļĒāļāđāļ็āļ Lua āļ็āļāļ°āđāļ็āļ return 2+3+5 10 >>(>= 6 3 1) ; return (6 >= 3) and (3 >= 1) true >>(and x y z) ; return x and y and z nil
- āļĄี match pattern āļี่āļāļāļāļāļēāļāđāļ้āđāļāļ switch case āđāļĨ้āļ§āļĒัāļāļŠāļēāļĄāļēāļĢāļāļัāļāļู่āļ่āļēāđāļ table āļัāļāļัāļ§āđāļāļĢāđāļ pattern āđāļ้āļ้āļ§āļĒ
(let [case ["a" "b" "c"]] (match case [3 a b] (+ a b) ; āđāļĄ่ match "a" āđāļĄ่āđāļ่āļēāļัāļ 3 [w x y z] "hello" ; āđāļĄ่ match āļāļģāļāļ§āļāļŠāļĄāļēāļิāļāđāļ array āđāļĄ่āļāļĢāļāļัāļ [x "b" y] (.. y x))) ; match "b" āļัāļāļู่ x = "a" āđāļĨāļ° y = "c" ;; āđāļ้āļāļĨāļĨัāļāļ์āđāļ็āļ "ca"
āļŦāļĢืāļāđāļ้āļัāļāļุāļāļāļāļāļ้āļāļĄูāļĨāļŦāļĨāļēāļĒāļัāļ§āļ็āđāļ้-- āļāļēāļāđāļ้āļ Lua local f, error_msg = io.open "abc.txt" if f then print(type(f)) f:close() -- āļุāļāļ่āļēāļāļืāļ Lua āđāļĄ่āļĄีāļāļēāļĢāļืāļāļ่āļēāđāļ่ Fennel āļāļ°āđāļŦāļĄืāļāļāļัāļ return f:close() else print(error_msg) -- āļุāļāļ่āļēāļāļืāļ Lua āđāļĄ่āļĄีāļāļēāļĢāļืāļāļ่āļēāđāļ่ Fennel āļāļ°āđāļŦāļĄืāļāļāļัāļ return print(error-msg) end
; āđāļีāļĒāļāđāļ็āļ Fennel āļัāļāļี้ (let [(f error-msg) (io.open "abc.txt")] (if f (do ; if āļāļ°āļĄีāđāļ่āļิāļāļāļ์āļิāļāļāļ์āļี่āđāļื่āļāļāđāļāđāļ็āļāļāļĢิāļāļัāļāļิāļāļāļ์āļี่āđāļื่āļāļāđāļāđāļ็āļāđāļ็āļāļāļĒ่āļēāļāļĨāļ°āļŦāļึ่āļāđāļāđāļ่āļĨāļ°āđāļื่āļāļāđāļāļ้āļēāļāļĒāļēāļāđāļŦ้āļĄีāļŦāļĨāļēāļĒāļิāļāļāļ์āļ้āļāļāđāļ้ (do ) āļāļĢāļāļ ( āđāļŦāļĄืāļāļ do end āļāļĨ๊āļāļāđāļāđāļ Lua ) (print (type f)) (f:close)) (print error-msg))) ; āļŠāļēāļĄāļēāļĢāļāđāļ้ match āđāļāļāļēāļĢāļัāļāļู่āļัāļ§āđāļāļĢāđāļāļāđāļ้ (match (io.open "abc.txt") (nil error-msg) (print error-msg) ; āļ้āļēāļ่āļēāļี่āļŠ่āļāļāļĨัāļāļĄāļēāļāļēāļ io.open āļĄีāļŦāļĨāļēāļĒāļ่āļēāđāļĨāļ°āļ่āļēāđāļĢāļāđāļ็āļ nil āđāļŦ้āļิāļĄāļ์āļ่āļēāļี่āļŠāļāļ f (do ; āļ้āļēāļĄีāļ่āļēāđāļีāļĒāļ§āđāļŦ้āļิāļĄāļ์āļāļĢāļ°āđāļ āļāļāļāļāļ่āļēāļั้āļāļāļēāļāļั้āļāđāļŦ้āļิāļāđāļāļĨ์ (print (type f)) (f:close)))
- āļĄี destructuring āđāļŦāļĄืāļāļāđāļ JavaScript
(let [[a b] [1 3] ; a = ({1, 3})[1] āđāļĨāļ° b = ({1, 3})[2] {:x x2 : y} {:x 2 :y 6}] ; x2 = ({x = 2, y = 6}).x āđāļĨāļ° y = ({x = 2, y = 6}).y (print (+ a b)) ; āđāļ้ 4 ( 1+3 ) (print x2 y)) ; āđāļ้ 2 6
- āļัāļ§āđāļĨāļāļŠāļēāļĄāļēāļĢāļāđāļāļĢāļ underscore āđāļื่āļāđāļŦ้āļ่āļēāļāļ่āļēāļĒāđāļ่āļ 1_932_490
- āļŠāļēāļĄāļēāļĢāļāđāļāļĢāļāļ้āļāļāļ§āļēāļĄāđāļ็āļ docstring āđāļāļัāļāļ์āļัāļāđāļ้
- āļĄี table comprehension āđāļิ่āļĄāļāļ§āļēāļĄāļŠāļ°āļāļ§āļāđāļāļāļēāļĢāļŠāļĢ้āļēāļ table āđāļŦāļĄ่āļāļēāļ table āđāļิāļĄ
-- āđāļāļ āļēāļĐāļē Lua āđāļāļēāđāļāļāļēāļ°āđāļĨāļāļู่āļĄāļēāļŠāļĢ้āļēāļ table āđāļŦāļĄ่āđāļĢāļēāđāļ้āļĨูāļāļāļĢāļĢāļĄāļāļē local t1 = {1, 2, 3, 4, 5, 6} local t2 = {} for i, v in ipairs(t1) do if v % 2 == 0 then t2[#t2+1] = v end end -- āļŦāļĢืāļāđāļ้āļĄāļāļูāļĨāđāļŠāļĢิāļĄ -- āļึ่āļāļ็āļāļ°āđāļāļĨāļāļāļĨัāļāđāļ็āļāļĨูāļāļāļĢāļĢāļĄāļāļēāđāļ่āļĄี overhead āļāļēāļāļัāļāļ์āļัāļāđāļ่āđāļŦ้āđāļีāļĒāļāđāļ้āļāļ่āļēāļĒāļึ้āļ -- āđāļ่āđāļĄ่āļĄีāļāļĨāļ้āļēāļāļāļĢāļ°āļŠิāļāļิāļ āļēāļāļีāļึ้āļāđāļ่āļāļĒ่āļēāļāđāļ local comp = require("pl.comprehension").new() local t3 = comp "x for x if x % 2 == 0" (t1)
-- MoonScript āļāļ°āļāļĨ้āļēāļĒāđāļ Python t1 = [1, 2, 3, 4, 5, 6] t2 = [x for x in *t1 when x % 2 == 0]
; āđāļ Fennel āļāļēāļĢāđāļ้āļĨูāļāļāļāļิ (let [t1 [1 2 3 4 5 6] ; do local t1 = {1, 2, 3, 4, 5, 6} t2 []] ; local t2 = {} (each [_ v (ipairs t1)] ; for _, v in ipairs(t1) do (when (= (% v 2) 0) ; if v % 2 == 0 then (tset t2 (+ (length t2) 1) v))) ; t2[#t2 + 1] = v end--if ; end--for t2) ; return t2 ; end--do ; āļŠāļēāļĄāļēāļĢāļāđāļ้ collect āļัāļ icollect āđāļāļāđāļ้ ; āđāļāļ icollect āđāļ้āļัāļ value (let [t1 [1 2 3 4 5 6] t2 (icollect [_ v (ipairs t1)] (when (= (% v 2) 0) v))] ; āļืāļāļ่āļē v āļัāļ§āđāļีāļĒāļ§ t2) ; āđāļāļ collect āđāļ้āļัāļāļู่ key value (var i 0) (let [t1 [1 2 3 4 5 6] t2 (collect [_ v (ipairs t1)] (when (= (% v 2) 0) (set i (+ i 1)) (values i v)))] ; āļืāļāļ่āļēāđāļ็āļāļู่āļĨāļģāļัāļ i, v t2) ; āļāļ°āđāļ้āļāļĨāļĨัāļāļ์āđāļŦāļĄืāļāļāļัāļāđāļ่āļāļēāļĢāđāļ้ table comprehension āļāļ°āđāļีāļĒāļāļ่āļēāļĒāļāļ§่āļēāļāļēāļĢāđāļ้āļĨูāļ ; āļāļĢāļĢāļีāļี่āđāļ็āļāļāļēāļĢ copy āļŦāļĢืāļ slice table āļŠāļēāļĄāļēāļĢāļāđāļ้āļāļēāļĢ destruct āđāļ้ (var t1 [1 2 3 4 5 6]) ; t1 == [1 2 3 4 5 6] (var [& t1-copy] t1) ; t1-copy == [1 2 3 4 5 6] (var [head & tail] t1) ; head == 1, tail == [2 3 4 5 6]
- āļĄี nil-safe table lookup āđāļ่āļ
-- āđāļāļ āļēāļēāļĐāļē Lua local t = {1, {a = 2, b = {3, 4}}} print(t[2].b[1]) -- āđāļ้ 3 print(t[2].c) -- āđāļ้ nil āđāļāļĢāļēāļ°āđāļĄ่āļĄี index "c" print(t[2].c[1]) -- error āđāļāļĢāļēāļ° "c" āđāļ็āļ nil āđāļĄ่āđāļ่ table āđāļĄ่āļĄี index
;; āđāļāļ āļēāļēāļĐāļē Fennel (. t 2 :c 1) ; error āđāļŦāļĄืāļāļ Lua (?. t 2 :c 1) ; āđāļ้ nil āđāļĄ่ error
- āļุāļāļāļĒ่āļēāļāļืāļāļิāļāļāļ์āđāļื่āļāļāđāļāļ็āđāļ็āļāļิāļāļāļ์
(var a true) (set a (if a false true))
āđāļีāļĒāļāđāļ็āļ lualocal a = true if a then a = false else a = true end
- āļĄีāļĄāļēāđāļāļĢāđāļŠāļĢิāļĄāđāļ่āļ doto macro āđāļĨāļ° threading macros āļŠāļģāļŦāļĢัāļāļัāļāļĨāļģāļัāļāļāļēāļĢāļāļģāļāļēāļāđāļ้āđāļ่ " -> ", " ->> ", " -?> ", " -?>> "
;; āđāļ่āļāļāļēāļĢāđāļ้ A and B or C āđāļ Lua āđāļĄื่āļāđāļ็āļ Fennel āļāļ°āđāļ็āļ (or (and A B) C) ;; āđāļ่āđāļĄื่āļāđāļ้ -> āļāļ°āđāļ็āļ (-> A (and B) (or C)) ;; āļāļ°āđāļŦ็āļāļ§่āļēāļ่āļēāļāļ่āļēāļĒāļāļ§่āļēāđāļŦāļĄāļēāļ°āļŠāļģāļŦāļĢัāļāļัāļāļāļēāļĢāļัāļāļāļēāļĢāđāļ้āļัāļāļัāļāļ์āļัāļāļ้āļāļāđ āļัāļāļŦāļĨāļēāļĒāļั้āļ ;; āļŠ่āļ§āļ ->> āļāļ°āļāļĨัāļāļัāļāđāļāļēāļ่āļēāđāļāđāļāļāļŠ่āļ§āļāļ้āļēāļĒ (->> B (and A) (or C)) ;; āļāļ°āđāļ้āđāļ็āļ (or C (and A B)) ;; āļŠ่āļ§āļ -?> āđāļĨāļ° -?>> āļāļ°āđāļิ่āļĄāļāļēāļĢāļŠāļĢāļ§āļāļŠāļāļāļ่āļē nil āļ้āļ§āļĒ ;; doto āļāļ°āļāļĨ้āļēāļĒ with āđāļāļ āļēāļĐāļēāļื่āļāđāļ่āļ (tset very-very-long-table-name :key1 value1) (tset very-very-long-table-name :key2 value2) (tset very-very-long-table-name :key3 value3) ;; āļŠāļēāļĄāļēāļĢāļāđāļีāļĒāļāđāļŦ้āļŠั้āļāļึ้āļāļ้āļ§āļĒ (let [x very-very-long-table-name] (tset x :key1 value1) (tset x :key2 value2) (tset x :key3 value3)) ;; āļŦāļĢืāļāđāļ้ doto āđāļāļ (doto very-very-long-table-name (tset :key1 value1) (tset :key2 value2) (tset :key3 value3))
Fennel āđāļ็āļāļ āļēāļĐāļēāđāļิāļāļิāļāļāļ์
āļิāļāļāļ์āđāļ Fennel āļāļĢāļ°āļāļāļāđāļāļ้āļ§āļĒāļ้āļāļĄูāļĨ ( āļ āļēāļĐāļēāļāļĢāļ°āļูāļĨ Lisp āđāļĢีāļĒāļāļ§่āļē atom ) āļŦāļĢืāļāļĨิāļŠāļ์āļāļāļāļ้āļāļĄูāļĨ āđāļāļĒāļี่āļ้āļāļĄูāļĨāļัāļ§āđāļĢāļāļāļ°āđāļ็āļāļัāļāļ์āļัāļāđāļĨāļ°āļัāļ§āļี่āđāļŦāļĨืāļāļāļ°āđāļ็āļāļāļēāļĢ์āļิāļ§āđāļĄāļāļ์āļāļāļāļัāļāļ์āļัāļāļั้āļ ( āļึ่āļāļ็āļืāļ function call āļั่āļāđāļāļ (print 1 2 3 "a") ---> print(1, 2, 3, "a"), (myfunc) ---> myfunc() ) āļึ่āļāđāļ่āļĨāļ°āļāļēāļĢ์āļิāļ§āđāļĄāļāļ์āļāļ°āļูāļāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļ่āļāļāļŠ่āļāđāļ้āļēāļัāļāļ์āļัāļāļĒāļāđāļ§้āļ special form āļี่āļĄีāļĨัāļāļĐāļāļ°āļ่āļēāļāļāļāļāđāļāđāļ่āļ (if condition value1 value2) āļāļ°āđāļ็āļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ condition āļ้āļēāļāļĢิāļāļāļ°āļืāļāļ่āļē value1 āđāļāļĒāđāļĄ่āļĄีāļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāđāļāļŠ่āļ§āļāļāļāļ value2 āđāļĨāļ°āļ้āļēāđāļ็āļāđāļ็āļāļāļ°āļืāļāļ่āļē value2 āđāļāļĒāļ้āļēāļĄāļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāđāļāļŠ่āļ§āļāļāļāļ value1 āđāļ็āļāļ้āļ
āđāļāļŠ่āļ§āļāļāļāļāļัāļāļ์āļัāļāđāļĨāļ°āļāļĨ๊āļāļāļāļ°āļืāļāļ่āļēāļิāļāļāļ์āļŠุāļāļ้āļēāļĒāđāļŠāļĄāļ Fennel āđāļĄ่āļĄี early return āđāļĨāļ°āđāļĄ่āļĄี break āđāļ่āļŠāļēāļĄāļēāļĢāļāđāļ้ lua escape hatch āļĄีāļĢูāļāđāļāļāļัāļāļี้ (lua "Lua expression") āđāļ่āļ
(fn test-lua [n] ; function test_lus(n)
(for [i 1 10] ; for i = 1, 10 do
(when (> i n) ; if i > n then
(lua "return i")) ; return i end--if
(print (.. "i = " i))) ; print("i = "..i) end--for
(.. n " >= 10")) ; return n .. " >= 10" end--function
(test-lua 10) ; āļิāļĄāļ์ "i = 1" āđāļāļāļāļึāļ "i = 10" āđāļĨ้āļ§āļืāļāļ่āļē "10 >= 10"
(test-lua 5) ; āļิāļĄāļ์ "i = 1" āđāļāļāļāļึāļ "i = 5" āđāļĨ้āļ§āļืāļāļ่āļē "6"
āđāļ่āđāļāļĢุ่āļāļĨ่āļēāļŠุāļ ( 0.9 ) āđāļ้āđāļิ่āļĄ :until āļŠāļģāļŦāļĢัāļāļāļēāļĢāļāļāļāļāļēāļāļĨูāļāļĄāļēāļ้āļ§āļĒāđāļ่āļ
(fn test-until [n] ; function test_until(n)
(var res 0) ; local res = 0
(for [i 1 10 :until (> i n)] ; for i = 1, 10 do if i > n then break end--if
(set res i) ; res = i
(print (.. "i = " res))) ; print("i = "..res) end--for
(if (< res 10) ; if res < 10 then
(+ res 1) ; return res + 1
(.. n " >= " res))) ; else return (n .. " >= " .. res) end--if
; end--function
(test-until 10)
(test-until 5) ; āļāļĨāļĨัāļāļ์āđāļŦāļĄืāļāļāļัāļāļ์āļัāļāļ้āļēāļāļāļ
;; āļัāļ§āļāļĒ่āļēāļāļāļēāļĢāđāļāļāļāļāļāļāļēāļāļĨูāļāđāļāļāļ่āļēāļāđ
; āļāļēāļĢāđāļ้ while
(fn check-win1 [p] ; function check_win(p)
(var (result i) (values true 1)) ; local result, i = true, 1
(while (<= i (length win)) ; while i <= #win do
(set result (all p (. win i))) ; result = all(p, win[i])
(if result ; if result then
(set i (+ (length win) 1)) ; i = #win + 1
(set i (+ i 1)))) ; else i = i + 1 end--if
; end--while
result) ; return result end--function
; āļāļēāļĢāđāļีāļĒāļāļัāļāļ์āļัāļāđāļāļ recursion
(fn check-win2 [p w k r] ; function check_win2(p, w, k, r)
(var (key line) (next win k)) ; local key, line = next(win, k)
(if (or (not w) (and key (not r))) ; if (not w) or (key and (not r)) then
(check-win2 p line key (all p line)) ; return check_win2(p, line, key, all(p, line))
r)) ; else return r end--if
; end--function
; āļāļēāļĢāđāļ้ :until āđāļāļĨูāļ
(fn check-win3 [p] ; function check_win3(p)
(var result false) ; local result = false
(each [_ v (ipairs win) :until result] ; for _, v in ipairs(win) do if result then break end--if
(set result (all p v))) ; result = all(p, v) end--for
result) ; return result end--function
; āļāļēāļĢāđāļ้ lua escape hatch
(fn check-win4 [p] ; function_win4(p)
(var result false) ; local result = false
(each [_ v (ipairs win)] ; for _, v in ipairs(win) do
(set result (all p v)) ; result = all(p, v)
(when result (lua :break))) ; if result then break end--if
; end--for
result) ; return result end--function
; āļŦāļĢืāļ
(fn check-win5 [p] ; function check_win5(p)
(each [_ v (ipairs win)] ; for _, v in ipairs(win) do
(when (all p v) (lua "return true"))) ; if all(p, v) then return true end--if
; end--for
false) ; return false end--function
āđāļŦ็āļāđāļ้āļ§่āļēāđāļĄ้āļāļ°āđāļ็āļāļ āļēāļĐāļēāļĢูāļāđāļāļāļāļāļ Lisp āđāļ่āļāļēāļĢāđāļีāļĒāļāđāļĄ่āļ่āļēāļāļāļēāļ Lua āļāļāļิāļĄāļēāļāļัāļāļāļāļี่āđāļ็āļ Lua āļĄāļēāđāļĨ้āļ§āļ็āļŠāļēāļĄāļēāļĢāļāļŦัāļ Fennel āđāļ้āđāļĄ่āļĒāļēāļāļัāļāļัāļ§āđāļāļĨāļ āļēāļĐāļēāđāļีāļĒāļāļ้āļ§āļĒāļ āļēāļĐāļē Lua āđāļĨāļ°āļัāļ§ Fennel āđāļāļāļัāļāļ้้āļāđāļĄ่āļ้āļāļāļิāļāļั้āļāļāļ°āđāļĢāđāļิ่āļĄāđāļิāļĄāļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāļ้āđāļāđāļāļĢāđāļāļāđāļิāļĄāđāļ้āļ่āļēāļĒāđāļĄ่āļ้āļāļāļāļĢัāļāđāļāļĨี่āļĒāļāļāļ°āđāļĢāļĄāļēāļāļāļ°āļĢัāļāđāļāļĢāđāļāļĢāļĄāļ้āļ§āļĒ Fennel āđāļāļāđāļĨāļĒāļŦāļĢืāļāļāļ°āļāļāļĄāđāļāļĨ์āđāļ็āļāđāļāļĨ์ Lua āđāļĨ้āļ§āđāļāļēāđāļāļĢัāļāđāļ Lua āļีāļāļีāļ็āđāļ้ āļŦāļĢืāļāļāļ°āđāļŦ้āđāļāļĨ์ Lua āđāļŦāļĨāļāļĄāļāļูāļĨ Funnel āļ็āđāļ้āđāļ่āļāļัāļāļ้āļēāļŠāļāđāļāđāļĨ้āļ§āļ็āļĨāļāļāđāļāđāļĨ่āļāļูāđāļ้āļāļĢัāļāļ้āļēāđāļāļĢāļĄี luarocks āļāļĒู่āđāļĨ้āļ§āļ็āđāļ่
$ luarocks install fennel
āļŦāļĢืāļāđāļāļĢāļี่āļĨāļāđāļāļĢāđāļāļĢāļĄ Tic-80 āļี่āđāļ้āļŠāļĢ้āļēāļāđāļāļĄ 8 āļิāļāđāļ§้āđāļĨ้āļ§āļ็āļŠāļēāļĄāļēāļĢāļāđāļ้ Fennel āđāļ้āđāļĨāļĒ ( āđāļ่āđāļĄ่āđāļ่ Fennel āļĢุ่āļāļĨ่āļēāļŠุāļ ( āđāļ Tic āđāļ็āļāļĢุ่āļ 0.6.1-dev ) syntax āļāļēāļāļัāļ§āļāļēāļāđāļĄ่āđāļŦāļĄืāļāļāļัāļāļŦāļĢืāļāđāļĄ่āļĄีāđāļāļĢุ่āļāđāļ่āļēāļāļ§่āļē ) āđāļ่āļิāļĄāļ์ new fennel ( āļ้āļē new āđāļāļĒāđ āļāļ°āđāļ็āļ Lua ) āļี่āļāļāļāđāļāļĨāļāļāļāđāļāļĢāđāļāļĢāļĄāļāļĢัāļ āļŠāļģāļŦāļĢัāļāļāļāļāļ§āļēāļĄāļี้āļ็āļāļāļāļāđāļีāļĒāļāđāļ่āļēāļี้āļŠāļ§ัāļŠāļีāļ§ัāļāļŠāļāļāļēāļĢāļāļ์āļĨ่āļ§āļāļŦāļ้āļēāļāļĢัāļ ðāđāļāļēāļĢูāļāļัāļāļีāļĨ้āļāļĄāļĄāļēāļāļēāļ |
āļāļģāļĨัāļāļŠāļāđāļāļ āļēāļĐāļē Fennel āļāļāļีāļ่āļ° āļ§่āļēāļāļ°āļŦัāļāđāļีāļĒāļāđāļĨ่āļāļู āļāļāļิāđāļีāļĒāļāļ้āļ§āļĒ MoonScript āļ่āļ°
āļāļāļāļĨāļāļ้āļ āļāļāļāļี้ TIC-80 āļัāļāđāļāļāđāļ็āļ Fennel āđāļ§āļāļĢ์āļั่āļāļĨ่āļēāļŠุāļ (1.3.0) āđāļĨ้āļ§āļ่āļ°
MoonScript āļ็āļŠāļุāļāļีāļāļĢัāļāļ้āļēāļāļัāļ OOP āļŠāļĢ้āļēāļāļāļĨāļēāļŠ Fennel āļāļ°āđāļāļāļēāļ functional āļ้āļēāļāļ°āļŠāļĢ้āļēāļ object āļ้āļāļāļัāļāļāļēāļĢ table āđāļāļāđāļĄ่āļ็āđāļŦāļĨāļāđāļĄāļูāļĨāļ āļēāļĒāļāļāļāļĄāļēāļ่āļ§āļĒ
āļĨāļ