What is fennel?

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))
    
     āđ€āļ—ีāļĒāļšāđ€āļ›็āļ™ lua
    local 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 ) āļ—ี่āļ„āļ­āļ™āđ‚āļ‹āļĨāļ‚āļ­āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ„āļĢัāļš āļŠāļģāļŦāļĢัāļšāļšāļ—āļ„āļ§āļēāļĄāļ™ี้āļ็āļ‚āļ­āļˆāļšāđ€āļžีāļĒāļ‡āđ€āļ—่āļēāļ™ี้āļŠāļ§ัāļŠāļ”ีāļ§ัāļ™āļŠāļ‡āļāļēāļĢāļ“āļ•์āļĨ่āļ§āļ‡āļŦāļ™้āļēāļ„āļĢัāļš 😄

āđ€āļ­āļēāļĢูāļ›āļœัāļāļŠีāļĨ้āļ­āļĄāļĄāļēāļāļēāļ

āļ„āļ§āļēāļĄāļ„ิāļ”āđ€āļŦ็āļ™

  1. āļāļģāļĨัāļ‡āļŠāļ™āđƒāļˆāļ āļēāļĐāļē Fennel āļžāļ­āļ”ีāļ„่āļ° āļ§่āļēāļˆāļ°āļŦัāļ”āđ€āļ‚ีāļĒāļ™āđ€āļĨ่āļ™āļ”ู āļ›āļāļ•ิāđ€āļ‚ีāļĒāļ™āļ”้āļ§āļĒ MoonScript āļ„่āļ°

    āļ­้āļ­ āļ•āļ­āļ™āļ™ี้ TIC-80 āļ­ัāļžāđ€āļ”āļ•āđ€āļ›็āļ™ Fennel āđ€āļ§āļ­āļĢ์āļŠั่āļ™āļĨ่āļēāļŠุāļ” (1.3.0) āđāļĨ้āļ§āļ„่āļ°

    āļ•āļ­āļšāļĨāļš
    āļ„āļģāļ•āļ­āļš
    1. MoonScript āļ็āļŠāļ™ุāļāļ”ีāļ„āļĢัāļšāļ–้āļēāļ–āļ™ัāļ” OOP āļŠāļĢ้āļēāļ‡āļ„āļĨāļēāļŠ Fennel āļˆāļ°āđ„āļ›āļ—āļēāļ‡ functional āļ–้āļēāļˆāļ°āļŠāļĢ้āļēāļ‡ object āļ•้āļ­āļ‡āļˆัāļ”āļāļēāļĢ table āđ€āļ­āļ‡āđ„āļĄ่āļ็āđ‚āļŦāļĨāļ”āđ‚āļĄāļ”ูāļĨāļ āļēāļĒāļ™āļ­āļāļĄāļēāļŠ่āļ§āļĒ

      āļĨāļš

āđāļŠāļ”āļ‡āļ„āļ§āļēāļĄāļ„ิāļ”āđ€āļŦ็āļ™