Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Lua 编程

jdd
May 15, 2013
220

Lua 编程

jdd

May 15, 2013
Tweet

Transcript

  1. Programming in Lua Programming in Lua ቔᆀğRoberto Ierusalimschy يၲğwww.luachina.net Simple

    is beautiful Copyright ® 2005, Translation Team, www.luachina.net
  2. Programming in Lua i Copyright ® 2005, Translation Team, www.luachina.net

    ϱಃലૼ uProgramming in Luav֥يၲႮwww.luachina.netປӮbЧᅟၘࣜᆘ֤ቔᆀMr. Roberto Ierusalimschy֥๝ၩđ ॖၛيၲ෰֥ᇷቔѩᄝЧᅟؿ҃đ Ч඀֥ϱಃ݂Mr. Roberto Ierusalimschy ෮ႵđႵܱϱಃ౨ҕॉ༯૫ႄሱܲٚຩᅟ֥ലૼđໃࣜྸॖ҂֤೼ሱሇ์ ࠇᆀၛ಩ޅྙൔؿ҃Ч඀đڎᄵުݔሱڵb Copyright © 2003-2004 Roberto Ierusalimschy. All rights reserved. This online book is for personal use only. It cannot be copied to other web sites or further distributed in any form.
  3. Programming in Lua i Copyright ® 2005, Translation Team, www.luachina.net

    ၲ྽ oჯӵᆽᆩ֡೏ᄜన࿠đପࣼ൞ృದ҂ఏđᅚष໴ྛಈđؿಈ֒ྣյಀb಴ґބக ܴ೘ದЧট׻ၛູ෰໳ۿႵ׿֞ᆭ૝đଧᆩ൐ԛট֥ࣨ൞໳ਟᇏቋ࿙ӈ҂ݖ֥໴ྛಈb ֱؓ೘ದ֨ൈၩթ౞൪đ໑ౝৼഈ҂ሱ࣌੝ԛാຬ֥പ೤b o಴ґྏᇏπ༟đචಈೂڄđ৵ఽ೘༯۾൝đડ୅ሱ֥࠭ն৯ଊሃ൭ࡾଲ׿҄đ೘ ඹᅱᆭࡗࣼॖ௥ಀؓٚ໴ྛಈđପᆩჯӵᆽ౞૭֎ཿ֥၂၂߄ࢳbᄜҷඔᅱđ಴ґππ ӹࣙđჰটؓٚ෮൐ෙ൞ࠞ࿙ӈ֥ಈඌđ֌ૄ၂ᅱन൞ݣ࣑҂๳đၩᄝಈ༵đई൭෺ቀ ᆭࡗႅݣࠞࠀި֥ଽ৯b p iiࣁ႞uе࿓ࡴv щӱე࿽ᆭႿӱ྽ჴđ೏໳ۿᅱൔᆭႿ༝໳ᆭದđᅱൔෙᇗေđ֌ᄝႿ൐Ⴈᆭದb ഻ᆀᆭ֡đ໳ۿᆺྛႿіđۚ൭ႨࡴđோҤᆺွၧຯ৯໭౫b ֒ࣂ໳ਟđஊљਟ৫đე࿽َᄖđਟਟሹሹ҂࠹ఃඔbᇶੀ໓߄֥C/C++aJavaa C#aVBĠொν၂჌֥FortranĠ׮෿ე࿽ᇏ֥PerlaTclaRubyaForthaPythonđၛࠣЧ ඀ࢺക֥LuaĠllđ֩֩֩֩bᄜࡆഈൗࢸഈପུ҂ᆩ֡آᄝଧ֥ᤊᤋ֥అఅܯܯ֥ hacker֘ܝԛট֥ၳམ฿ष֥ე࿽đေམࡼ۲োე࿽ଵೆ߈ᇏđ҂ၳႿӺದඪ૓b҂ྐ ॖྋആ၂༯BrainFuckე࿽1֥Hello Worldӱ྽đე࿽Чദ၇ೂః଀b-☺- >+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[ -]>++++++++[<++++>-]<.#>+++++++++++[<+++++>-]<.>++++++++[<+ ++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]+++++ +++++. ෙඪე࿽֥ຯ৯၇൐ႨᆀЧദ֥ྩູ֮ۚطקđ֌҂๝ე࿽Чദ֥ഡ࠹ႻႵ҂๝b ೏ಞႨ Java ཿཿҠቔ༢๤ଽނaPerl ཿཿ౺׮ӱ྽aC/C++ཿཿ web ႋႨđ׻໭ၳႿച ࣍౰ჹđݺ֗ᆺႨഈਔ֗Мb Lua Чദ൞ၛࡥֆႪ࿮ູЧđሢငႿԩ৘ପུ C ҂೼Ӊ֥಩ༀbࢹᇹ C/C++ູఃঔ ᅚđLua ॖ೺གྷ໭౫ᷠ৯bLua Чദປಆ቎࿖ ANSI C طཿӮđᆺေႵ C щၲఖֹ֥ٚđ Lua ьॖؿߨෲ֥৯ਈbLua ҂ླေሔ౰ Python ପဢ֥նطಆ֥९đ෾؟֥৆ሕđّط ߶௥ߊෲ֥Ⴊૅb ე࿽֥ႪૅđটሱႿ൐Ⴈᆀሱ֥࠭ۋ༁bLua ֥Ⴊ࿮đ္ᆺႵ൐ႨުҌ߶ૼϢb ဘఏوđಞ໡ૌ၂๝෷ഈ Lua ֥࿐༝ᆭ੪ll 1 Ⴕ౿֥Brain Fuckე࿽bhttp://www.muppetlabs.com/~breadbox/bf/
  4. Programming in Lua ii Copyright ® 2005, Translation Team, www.luachina.net

    Ч඀֥يၲđ൞www.luachina.netᇏழႶૌ܋๝୭৯֥ࢲݔb༯૫൞ҕაيၲა཮ؓ ֥ழႶğ -- file: 'thanks.lua' -- desc: to print the list of the contributing guys function list_iter (t) local i = 0 local n = table.getn(t) return function () i = i + 1 if i <= n then return t[i] end end end helpful_guys = { "----ҕაيၲ----", "buxiu", "ڌ໷႕฿", "zhang3", "morler", "lambda", "sunlight", "\n", "----ҕა཮ؓ----", "ڌ໷႕฿", "doyle", "flicker", "޽ളଊದ", "zhang3", "Kasi", "\n" } for e in list_iter(helpful_guys) do print(e) end www.luachina.netيၲቆ 2005 ୍ 7 ᄅ 26 ರ ᇿğЧ pdf ູيၲ۠đ཮ؓ۽ቔᄝࣉྛb
  5. Programming in Lua iii Copyright ® 2005, Translation Team, www.luachina.net

    ଢ੣ ϱಃലૼ ........................................................................................................................................ i ၲ྽................................................................................................................................................ i ଢ੣..............................................................................................................................................iii ֻ၂௉ ე࿽ ................................................................................................................................. 1 ֻ 0 ᅣ ྽࿽ ................................................................................................................................. 1 0.1 ྽࿽ .................................................................................................................................... 1 0.2 Lua֥൐Ⴈᆀ....................................................................................................................... 2 0.3 Lua֥ཌྷܱሧჷ................................................................................................................... 3 0.4 Ч඀ุ֥২ ........................................................................................................................ 3 0.5 ܱႿЧ඀ ............................................................................................................................ 3 0.6 ۋ྆ .................................................................................................................................... 4 ֻ 1 ᅣ ఏׄ ................................................................................................................................. 5 1.1 Chunks................................................................................................................................. 5 1.2 ಆअэਈ ............................................................................................................................ 7 1.3 Սمჿק ............................................................................................................................ 7 1.4 ଁ਷ྛٚൔ ........................................................................................................................ 7 ֻ 2 ᅣ ো྘ބᆴ ......................................................................................................................... 9 2.1 Nil........................................................................................................................................ 9 2.2 Booleans .............................................................................................................................. 9 2.3 Numbers............................................................................................................................. 10 2.4 Strings................................................................................................................................ 10 2.5 Functions ........................................................................................................................... 12 2.6 Userdata and Threads ........................................................................................................ 12 ֻ 3 ᅣ іղൔ ........................................................................................................................... 13 3.1 ෘඌᄎෘژ ...................................................................................................................... 13 3.2 ܱ༢ᄎෘژ ...................................................................................................................... 13 3.3 આࠠᄎෘژ ...................................................................................................................... 13 3.4 ৵ࢤᄎෘژ ...................................................................................................................... 14 3.5 Ⴊ༵ࠩ .............................................................................................................................. 15 3.6 і֥ܒᄯ ........................................................................................................................... 15 ֻ 4 ᅣ ࠎЧეم ....................................................................................................................... 18 4.1 ڮᆴეओ .......................................................................................................................... 18 4.2 अ҆эਈაս઒ॶčblockĎ ......................................................................................... 19 4.3 ॥ᇅࢲܒეओ .................................................................................................................. 20
  6. Programming in Lua iv Copyright ® 2005, Translation Team, www.luachina.net

    4.4 breakބreturnეओ............................................................................................................. 23 ֻ 5 ᅣ ݦඔ ............................................................................................................................... 24 5.1 ْ߭؟۱ࢲݔᆴ .............................................................................................................. 25 5.2 ॖэҕඔ ........................................................................................................................... 27 5.3 ଁ଀ҕඔ .......................................................................................................................... 28 ֻ 6 ᅣ ᄜંݦඔ ....................................................................................................................... 30 6.1 оЇ .................................................................................................................................. 32 6.2 ٤ಆअݦඔ ...................................................................................................................... 34 6.3 ᆞಒ֥ແטႨčProper Tail CallsĎ ............................................................................... 36 ֻ 7 ᅣ םսఖაٗ྘for........................................................................................................... 40 7.1 םսఖაоЇ .................................................................................................................. 40 7.2 ٓྟfor֥ეၬ.................................................................................................................. 42 7.3 ໭ሑ෿֥םսఖ .............................................................................................................. 43 7.4 ؟ሑ෿֥םսఖ .............................................................................................................. 44 7.5 ᆇᆞ֥םսఖ .................................................................................................................. 45 ֻ 8 ᅣ щၲ·ᄎྛ·ט൫ ....................................................................................................... 47 8.1 requireݦඔ........................................................................................................................ 49 8.2 C Packages......................................................................................................................... 50 8.3 հ༂ .................................................................................................................................. 51 8.4 ၳӈބհ༂ԩ৘ .............................................................................................................. 52 8.5 հ༂ྐ༏ބ߭۵ሶčTracebacksĎ ................................................................................ 53 ֻ 9 ᅣ ླྀ๝ӱ྽ ....................................................................................................................... 56 9.1 ླྀ๝֥ࠎԤ ...................................................................................................................... 56 9.2 ܵ֡ބݖੲఖ .................................................................................................................. 58 9.3 Ⴈቔםսఖ֥ླྀ๝ .......................................................................................................... 61 9.4 ٤ఽᅝൔ؟ཌӱ .............................................................................................................. 63 ֻ 10 ᅣ ປᆜൕ২ ..................................................................................................................... 68 10.1 Luaቔູඔऌ૭ඍე࿽൐Ⴈ ........................................................................................... 68 10.2 ઔغॖڏ৽ෘم ............................................................................................................ 71 ֻؽ௉ tablesაobjects............................................................................................................... 75 ֻ 11 ᅣ ඔऌࢲܒ ..................................................................................................................... 76 11.1 ඔቆ ................................................................................................................................ 76 11.2 ᆔބ؟ົඔቆ ................................................................................................................ 77 11.3 ৽і ................................................................................................................................ 78 11.4 ؒਙބච؊ؒਙ ............................................................................................................ 78 11.5 ࠢކބЇ ........................................................................................................................ 80 11.6 ሳژԱߏԊ .................................................................................................................... 80 ֻ 12 ᅣ ඔऌ໓ࡱაӻࣲ߄ ..................................................................................................... 84 12.1 ྽ਙ߄ ............................................................................................................................ 86
  7. Programming in Lua v Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 13 ᅣ Metatables and Metamethods ...................................................................................... 92 13.1 ෘඌᄎෘ֥Metamethods............................................................................................... 92 13.2 ܱ༢ᄎෘ֥Metamethods............................................................................................... 95 13.3 ९קၬ֥Metamethods................................................................................................... 96 13.4 іཌྷܱ֥Metamethods................................................................................................... 97 ֻ 14 ᅣ ߌ࣢ ........................................................................................................................... 103 14.1 ൐Ⴈ׮෿଀ሳ٠໙ಆअэਈ ...................................................................................... 103 14.2 ലૼಆअэਈ ............................................................................................................... 104 14.3 ٤ಆअ֥ߌ࣢ .............................................................................................................. 106 ֻ 15 ᅣ Packages .................................................................................................................... 109 15.1 ࠎЧٚم ...................................................................................................................... 109 15.2 ඲ႵӮჴčPrivacyĎ...................................................................................................111 15.3 Їა໓ࡱ .......................................................................................................................112 15.4 ൐Ⴈಆअі ...................................................................................................................113 15.5 ః෰၂ུ࠯ెčOther FacilitiesĎ...............................................................................115 ֻ 16 ᅣ ૫ཟؓའӱ྽ഡ࠹ ....................................................................................................118 16.1 ো...................................................................................................................................119 16.2 ࠿ӵ .............................................................................................................................. 121 16.3 ؟ᇗ࠿ӵ ...................................................................................................................... 122 16.4 ඲ႵྟčprivacyĎ ...................................................................................................... 125 16.5 Single-Method֥ؓའൌགྷٚم ................................................................................... 127 ֻ 17 ᅣ Weakі ...................................................................................................................... 128 17.1 ࠺ၫݦඔ ...................................................................................................................... 130 17.2 ܱ৳ؓའඋྟ .............................................................................................................. 131 17.3 ᇗඍջႵଏಪᆴ֥і .................................................................................................. 132 ֻ೘௉ ѓሙ९ ......................................................................................................................... 134 ֻ 18 ᅣ ඔ࿐९ ....................................................................................................................... 135 ֻ 19 ᅣ Table९ ...................................................................................................................... 136 19.1 ඔቆնཬ ....................................................................................................................... 136 19.2 Ҭೆ/೷Ԣ..................................................................................................................... 137 19.3 ஆ྽ .............................................................................................................................. 137 ֻ 20 ᅣ String९ ..................................................................................................................... 140 20.1 ଆൔ௄஥ݦඔ .............................................................................................................. 141 20.2 ଆൔ .............................................................................................................................. 143 20.3 ѽࠆčCapturesĎ........................................................................................................ 146 20.4 ሇߐ֥࠯ెčTricks of the TradeĎ............................................................................ 151 ֻ 21 ᅣ IO९........................................................................................................................... 157 21.1 ࡥֆI/Oଆൔ................................................................................................................. 157 21.2 ປಆI/O ଆൔ............................................................................................................... 160
  8. Programming in Lua vi Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 22 ᅣ Ҡቔ༢๤९ ............................................................................................................... 165 22.1 DateބTime ................................................................................................................... 165 22.2 ః෱֥༢๤טႨ .......................................................................................................... 167 ֻ 23 ᅣ Debug९..................................................................................................................... 169 23.1 ሱസčIntrospectiveĎ ................................................................................................. 169 23.2 Hooks............................................................................................................................. 173 23.3 Profiles........................................................................................................................... 174 ֻඹ௉ C API ........................................................................................................................... 177 ֻ 24 ᅣ C APIሺফ ................................................................................................................. 178 24.1 ֻ၂۱ൕ২ӱ྽ .......................................................................................................... 179 24.2 ؐᅜ .............................................................................................................................. 181 24.3 C API֥հ༂ԩ৘ ......................................................................................................... 186 ֻ 25 ᅣ ঔᅚ୆֥ӱ྽ ........................................................................................................... 188 25.1 іҠቔ .......................................................................................................................... 189 25.2 טႨLuaݦඔ................................................................................................................ 193 25.3 ๙Ⴈ֥ݦඔטႨ .......................................................................................................... 195 ֻ 26 ᅣ טႨCݦඔ................................................................................................................. 198 26.1 C ݦඔ........................................................................................................................... 198 26.2 C ݦඔ९....................................................................................................................... 200 ֻ 27 ᅣ ለཿCݦඔ֥࠯ె..................................................................................................... 203 27.1 ඔቆҠቔ ...................................................................................................................... 203 27.2 ሳژԱԩ৘ .................................................................................................................. 204 27.3 ᄝCݦඔᇏЌթሑ෿.................................................................................................... 207 ֻ 28 ᅣ User-Defined Types in C ........................................................................................... 212 28.1 Userdata......................................................................................................................... 212 28.2 Metatables...................................................................................................................... 215 28.3 ٠໙૫ཟؓའ֥ඔऌ .................................................................................................. 217 28.4 ٠໙ඔቆ ...................................................................................................................... 219 28.5 Light Userdata ............................................................................................................... 220 ֻ 29 ᅣ ሧჷܵ৘ ................................................................................................................... 222 29.1 ଢ੣םսఖ .................................................................................................................. 222 29.2 XMLࢳ༅ ...................................................................................................................... 225
  9. Programming in Lua 1 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 0 ᅣ ྽࿽ ЧᅣЇওቔᆀ֥྽࿽a໓ᅣุ֥২čconventionĎၛࠣః෱၂ུoૄЧ඀ष๨׻߶֥ ଽಸp b 0 0. .1 1 ྽ ྽࿽ ࿽ ଢభޓ؟ӱ྽ე࿽׻ህᇿႿϺ୆щཿӮతഈຣྛ֥ս઒đ෮ၛՎো྘֥ე࿽෮ิ܂ ֥Їaଁ଀ॢࡗaگᄖ֥ো྘༢๤ࠣ໭ඔ֥ࢲܒđႵഈత်֥໓֖ླေҠቔᆀ࿐༝b ط Lua ѩ҂Ϻ୆щཿնਈ֥ս઒֥ӱ྽đཌྷّ֥đLua ࣇಞ୆Ⴈഒਈ֥ս઒ࢳथܱ ࡯໙ีbູൌགྷᆃ۱ଢѓđཞః෰ე࿽၂ဢ Lua ၇ঠႿఃॖঔᅚྟb֌൞აః෰ე࿽҂ ๝֥൞đ҂ࣇႨ Lua щཿ֥ೈࡱၞႿঔᅚđط౏Ⴈః෰ე࿽бೂ C/C++щཿ֥ೈࡱ္ޓ ಸၞ൐Ⴈ Lua ঔᅚఃۿିb ၂ष൓đLua ࣼФഡ࠹ӮޓಸၞބԮ๤֥ C/C++ᆜކ֥ე࿽bᆃᇕე࿽֥ؽჭྟջ টਔࠞն֥ݺԩbLua ൞၂۱ཬెطࡥֆ֥ე࿽đၹູ Lua ҂ᇁ৯Ⴟቓ C ე࿽ၘࣜቓ֤ ޓݺ֥ਵთđбೂğྟିaָҪҠቔၛࠣაֻ೘ٚೈࡱ֥ࢤ१bLua ၇ঠႿ C ಀቓປӮ ᆃུ಩ༀbLua ෮ิ܂֥ࠏᇅ൞ C ҂೿Ⴟ֥ğۚࠩე࿽a׮෿ࢲܒaࡥࢱaၞႿҩ൫ބ ט൫֩bᆞၹູೂՎđLua ऎႵਅݺ֥νಆЌᆣđሱ׮ଽթܵ৘đࡥь֥ሳژԱԩ৘ۿ ିࠣః෰׮෿ඔऌ֥ڿэb Lua ҂ࣇ൞၂ᇕၞႿঔᅚ֥ე࿽đ္൞၂ᇕၞᆜކე࿽čglue languageĎ ĠLua ᆦӻ ࠎႿቆࡱ֥đ໡ૌॖၛࡼ၂ུၘࣜթᄝ֥ۚࠩቆࡱᆜކᄝ၂ఏൌགྷ၂۱ႋႨೈࡱb၂Ϯ ౦ঃ༯đቆࡱ൐Ⴈཞ C/C++֩࣡෿֥ე࿽щཿb֌ Lua ൞໡ૌᆜކ۲۱ቆࡱ֥ᅔކ࠴b Ⴛ๙ӈ౦ঃ༯đ ቆࡱ čࠇؓའĎ іགྷູऎุᄝӱ྽षؿݖӱᇏޓഒэ߄֥a ᅝႨնਈ CPU ൈࡗ֥थקྟ֥ӱ྽đ২ೂԳ१҆ࡱބඔऌࢲܒbؓପᇕᄝӁ௖֥ളଁᇛ௹ଽэ߄бࢠ ؟֥ႋႨٚཟ൐Ⴈ Lua ॖၛ۷ٚь֥ൡႋэ߄bԢਔቔູᆜކე࿽ຓđLua ሱദ္൞၂ ۱ۿି఼ն֥ე࿽bLua ҂ࣇॖၛᆜކቆࡱđߎॖၛщࠠቆࡱമᇀປಆ൐Ⴈ Lua Էࡹቆ ࡱb Ԣਔ Lua ຓđߎႵޓ؟োර֥࢖Чე࿽đ২ೂğPerlaTclaRubyaForthaPythonb ෙಖః෰ე࿽ᄝଖུٚ૫ა Lua Ⴕሢ܋๝֥ห೤đ֌༯૫ᆃུหᆘ൞ Lua หႵ֥ğ æ ॖঔᅚྟbLua ֥ঔᅚྟ٤ӈሜᄀđၛᇀႿޓ؟ದϜ Lua Ⴈቔձࡹਵთე࿽֥ ۽ऎčᇿğбೂႳ༤࢖ЧĎ bLua Фഡ࠹ູၞႿঔᅚ֥đॖၛ๙ݖ Lua ս઒ࠇᆀ C ս઒ঔᅚđ Lua ֥ޓ؟ۿି׻൞๙ݖຓ҆९টঔᅚ֥b Lua ޓಸၞა C/C++a javaa fortranaSmalltalkaAdađၛࠣః෰ე࿽ࢤ१b ç ࡥֆbLua ЧദࡥֆđཬెĠଽಸഒ֌ۿି఼նđᆃ൐֤ Lua ၞႿ࿐༝đޓಸ ၞൌགྷ၂ུཬ֥ႋႨb෰֥ປಆؿ҃ϱčս઒a൭Ҩၛࠣଖུ௜෻֥ؽࣉᇅ໓ࡱĎ
  10. Programming in Lua 2 Copyright ® 2005, Translation Team, www.luachina.net

    ࣇႨ၂ᅦೈ஍ࣼॖၛል֤༯b è ིۚੱbLua Ⴕޓ֥ۚᆳྛིੱđ๤࠹іૼ Lua ൞ଢభ௜नིੱቋ֥ۚ࢖Чე ࿽b é ა௜෻໭ܱbLua ࠫެॖၛᄎྛᄝ෮Ⴕ໡ૌ๐ඪݖ֥༢๤ഈđೂ NextStepa OS/2aPlayStation II (Sony)aMac OS-9aOS XaBeOSaMS-DOSaIBM mainframesaEPOCaPalmOSaMCF5206eLITE Evaluation BoardaRISC OSđࠣ෮Ⴕ֥ Windows ބ UnixbLua ҂൞๙ݖ൐Ⴈ่ࡱщၲൌགྷ௜෻໭ܱđط ൞ປಆ൐Ⴈ ANSI (ISO) Cđᆃၩ໅ሢᆺေ୆Ⴕ ANSI C щၲఖ୆ࣼॖၛщၲѩ ൐Ⴈ Luab Lua ն҆ٳ఼ն֥ۿିটሱႿ෰֥ো९đᆃѩ٤୽ಖbLua ֥Ӊԩᆭ၂ࣼ൞ॖၛ๙ ݖྍো྘ބݦඔটঔᅚఃۿିb׮෿ো྘࡟Ұቋնཋ؇ᄍྸ؟෿ԛགྷđѩሱ׮ࡥ߄טႨ ଽթܵ৘֥ࢤ१đၹູᆃဢ҂ླေܱྏජটٳ஥ଽթජট൤٢ଽթđ္҂сքྏඔऌၮ ԛbۚࠩݦඔބେ଀ݦඔनॖၛࢤ൳ۚࠩҕඔđ൐ݦඔ۷ູ๙Ⴈb Lua ሱջ၂۱ཬܿଆ֥ো९bᄝ൳ཋ༢๤ᇏ൐Ⴈ Luađೂళೆൔ༢๤đ໡ૌॖၛႵ ࿊ᄴֹνልᆃུো९b೏ᄎྛߌ࣢൅ٳ࿸۬đ໡ૌമᇀॖၛᆰࢤྩڿো९ჷս઒đࣇЌ ਽ླေ֥ݦඔb࠺ᇾğLua ൞ޓཬ֥čࠧ൐ࡆഈಆ֥҆ѓሙ९Ďѩ౏ᄝն҆ٳ༢๤༯୆ ಯॖၛ҂Ⴈքྏ֥൐Ⴈಆ֥҆ۿିb 0 0. .2 2 L Lu ua a ֥ ֥൐ ൐Ⴈ Ⴈᆀ ᆀ Lua ൐Ⴈᆀٳູ೘նোğ൐Ⴈ Lua ళೆ֞ః෰ႋႨᇏ֥a׿৫൐Ⴈ Lua ֥aࡼ Lua ބ C ࠁކ൐Ⴈ֥b ֻ၂ğ ޓ؟ದ൐Ⴈ Lua ళೆᄝႋႨӱ྽đ бೂ CGILua čձࡹ׮෿ຩ်Ď a LuaOrb č٠ ໙ CORBA ؓའbᆃུো྘Ⴈ Lua-API ᇿҨྍݦඔđԷࡹྍো྘đ๙ݖ஥ᇂ Lua ࣼॖၛ ڿэႋႨීᇶე࿽֥ྛູb๙ӈđᆃᇕႋႨ֥൐Ⴈᆀѩ҂ᆩ֡ Lua ൞၂ᇕ׿৫֥ე࿽b ২ೂğCGILua Ⴈ޼၂Ϯ߶ಪູ Lua ൞၂ᇕႨႿ Web ֥ე࿽b ֻؽğቔູ၂ᇕ׿৫ᄎྛ֥ე࿽đLua ္൞ޓႵႨ֥đᇶေႨႿ໓Чԩ৘ࠇᆀᆺᄎ ྛ၂Ց֥ཬӱ྽bᆃᇕႋႨ Lua ᇶေ൐Ⴈ෱֥ѓሙ९টൌགྷđѓሙ९ิ܂ଆൔ௄஥ބః ෱၂ུሳԱԩ৘֥ۿିb໡ૌॖၛᆃဢಪູğLua ൞໓Чԩ৘ਵთ֥ళೆൔე࿽b ֻ೘ğߎႵ၂ུ൐Ⴈᆀ൐Ⴈః෰ე࿽षؿđϜ Lua ֒ቔ९൐Ⴈbᆃུದն؟൐Ⴈ C ე࿽षؿđ֌൐Ⴈ Lua ࡹ৫ࡥֆਲࠃၞႿ൐Ⴈ֥ࢤ१b Ч඀૫ཟၛഈ೘ো؀ᆀb඀ֻ֥၂҆ٳӂඍਔე࿽֥Чദđᅚൕე࿽֥మᄝۿିb ໡ૌࢃඍਔ҂๝֥ე࿽ࢲܒđѩႨ၂ུ২ሰᅚൕೂޅࢳथൌ࠽໙ีbᆃ҆ٳ࠻ЇওࠎЧ ֥ე࿽֥॥ᇅࢲܒđ္Їও֥ۚࠩםսሰބླྀ๝b ֻؽ҆ٳᇗׄ٢ᄝ Lua หႵ֥ඔऌࢲܒiitables ഈ,ษંਔඔऌࢲܒaӻࣲྟaЇ ࠣ૫ཟؓའщӱđᆃ৚໡ૌࡼु֞ Lua ֥ᆇᆞ఼նᆭԩb ֻ೘҆ٳࢺകѓሙ९bૄ۱ѓሙ९၂ᅣğඔ࿐९atable ९astring ९aI/O ९aOS
  11. Programming in Lua 3 Copyright ® 2005, Translation Team, www.luachina.net

    ९aDebug ९b ቋު၂҆ٳࢺകਔ Lua ބ C ࢤ१֥ APIđᆃ҆ٳࢺകᄝ C ე࿽ᇏषؿႋႨط҂൞ Lua ᇏđႋႨؓႿପུյෘࡼ Lua ళೆ֞ C/C++ᇏ֥؀ᆀॖି߶ؓՎ҆ٳ۷ۋྖ౿b 0 0. .3 3 L Lu ua a ֥ ֥ཌྷ ཌྷܱ ܱሧ ሧჷ ჷ ೂݔ୆ᆇ֤མ࿐၂૊ე࿽đҕॉ൭Ҩ൞сС֥bЧ඀ބ Lua ҕॉ൭Ҩ޺ູҀԉđ൭ Ҩࣇࣇ૭ඍე࿽ЧദđၹՎ෰࠻҂߶ۡු୆ე࿽֥ඔऌࢲܒ္҂߶ई২ඪૼđ֌൭Ҩ൞ Lua ֥ಃຯྟ໓֖đhttp://www.lua.org ॖၛ֤֞൭Ҩ֥ଽಸb -- Lua Ⴈ޼ഠ౵đิ܂ਔ၂ֻུ೘ٚЇބ໓֖ http://lua-users.org -- Ч඀֥۷ྍा༂іđս઒ބ২ሰ http://www.inf.puc-rio.br/~roberto/book/ ਸ਼ຓЧ඀ࣇᆌؓ Lua 5.0đೂݔ୆֥ϱЧ҂๝đ౨Ұᄇ Lua ൭ҨࠇᆀбࢠϱЧࡗ֥ҵ ၳb 0 0. .4 4 Ч Ч඀ ඀֥ ุ֥ ุ২ ২ <1> ሳژԱ൐Ⴈචႄݼđбೂ"literal strings"Ġֆሳژ൐Ⴈֆႄݼđбೂ'a'ĠଆൔԱ ္൞Ⴈֆႄݼđбೂ'[%w_]*'b <2> ژݼ-->іൕეओ֥ൻԛࠇᆀіղൔ֥ࢲݔ: print(10) --> 10 13 + 3 --> 16 <3> ژݼ<-->іൕ֩ࡎđࠧؓႿ Lua টඪđႨ this ა that ીႵ౵љb this <--> that 0 0. .5 5 ܱ ܱႿ ႿЧ Ч඀ ඀ ष൓յෘཿᆃЧ඀൞ 1998 ୍׫฿(ଲ϶౯)đପൈީ Lua ϱЧ൞ 3.1Ġ2000 ୍ v4.0Ġ 2003 ୍ v5.0b ޓૼཁ֥൞đᆃུэ߄۳Ч඀ջটޓն֥ԊࠌđႵུଽಸാಀਔ෱թᄝ৘Ⴎđбೂ ܱႿӑᆴčupvaluesĎ֥گᄖ֥ࢳ൤b၂ུᅣࢫФᇗཿđбೂ C APIđਸ਼ຓ၂ུᅣࢫФᄹ ࡆࣉটđбೂླྀ๝ԩ৘b ҂෾ૼཁ֥൞đLua ე࿽Чദ֥ؿᅚؓЧ඀֥ປӮ္Ӂളਔޓն֥႕ཙb၂ུე࿽
  12. Programming in Lua 4 Copyright ® 2005, Translation Team, www.luachina.net

    ֥э߄ᄝЧ඀ᇏѩીႵФݤۂࣉটđᆃѩ٤୽ಖ֥bᄝЧ඀֥ԷቔݖӱᇏđႵ֥ൈީᄝ ଖ۱ᅣࢫ໡߶๬ಖۋतޓ঒ࠈđၹູ໡҂ᆩ֡ھՖޅष൓ࠇᆀᄸဢಀࢃ໙ีӂඍౢԣb ֒୆མ࣐৯ಀࢳ൤ౢԣೂޅ൐Ⴈ֥భิ൞୆ႋھत֤൐Ⴈᆃ۱ת༆ޓಸၞđᆃіૼ Lua ଖֹུٚླေФڿࣉbߎႵ֥ൈީđ໡ඨ০֥ཿປଖ۱ᅣࢫđࢲݔಏ൞ીႵದିु֤׭ ໡ཿ֥ࠇᆀીႵದؓ໡ᄝᆃ۱ᅣࢫଽіղ֥ܴׄղӮ၂ᇁbն҆ٳ౦ঃ༯đᆃ൞໡֥ݖ հၹູ໡൞۱ቔࡅđ୽غ໡္߶ၹՎؿགྷე࿽Чദ֥၂ུླေڿࣉ֥ಌཊčई২টඪđ Ֆ upvalues ֞ lexical scoping ֥ሇэ൞Ⴎ໭ၩၬ֥Ӈ൫෮ջট֥Аჼ෮ႄؿ֥đᄝՎ඀ ֥༵భ֥Ҥ۠৚đϜ upvalues ྙಸӮ൞ lexical scoping ֥၂ᇕĎ b Ч඀֥ປӮсྶڛՖე࿽֥э߄đЧ඀ᄝᆃ۱ൈީປӮ֥ჰၹğ <1> Lua 5.0 ൞၂۱Ӯඃ֥ϱЧ <2> ე࿽э֤ᄀটᄀնđӑԛਔቋԚЧ඀֥ଢѓbՎຓ၂۱ჰၹ൞໡௧్֥མࡼ Lua ࢺക۳նࡅಞ۷؟֥ದਔࢳ Luab 0 0. .6 6 ۋ ۋ྆ ྆ ᄝປӮЧ඀֥ݖӱᇏđޓ؟ದ۳ਔ໡ࠞն֥Ϻᇹğ Luiz Henrique de Figueiredo ބ Waldemar Celes ۳ਔ໡ޓն֥Ϻᇹđ൐֤Ч඀ିܔ۷ ݺປӮđLuiz Henrique ္Ϻᇹഡ࠹ਔЧ඀֥ଽ҆b Noemi Rodriguez, Andrʡ Carregal, Diego Nehab, ၛࠣ Gavin Wraith ᄇ؀ਔЧ඀֥Ҥ ۠ิԛਔޓ؟Ⴕࡎᆴ֥ࡹၰb Renato Cerqueira, Carlos Cassino, Tomʝs Guisasola, Joe Myers ބ Ed Ferguson ္ิԛ ਔޓ؟ᇗေ֥ࡹၰb Alexandre Nakonechnyj ڵᄳЧ඀֥ٿ૫ބଽ҆ഡ࠹b Rosane Teles ڵᄳ CIP ඔऌ֥ሙСb ྆྆෰ૌ෮Ⴕದb
  13. Programming in Lua 5 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 1 ᅣ ఏׄ ཿ၂۱ቋቋࡥֆ֥ӱ྽iiHello Worldb print("Hello World") ࡌק୆Ϝഈ૫ᆃओЌթᄝ hello.lua ໓ࡱᇏđ୆ᄝଁ਷ྛᆺླေğ prompt> lua hello.lua ु֞ࢲݔਔગ? ಞ໡ૌটु၂۱഍ັگᄖ֥ׄ২ሰğ -- defines a factorial function function fact (n) if n == 0 then return 1 else return n * fact(n-1) end end print("enter a number:") a = io.read("*number") -- read a number print(fact(a)) ᆃ۱২ሰקၬਔ၂۱ݦඔđ࠹ෘൻೆҕඔ n ֥ࢨӰĠЧ২ေ౰Ⴈ޼ൻೆ၂۱ඔሳ nđ ಖުյႆ n ֥ࢨӰb 1 1. .1 1 C Ch hu un nk ks s Chunk ൞၂༢ਙეओđLua ᆳྛ֥ૄ၂ॶეओđбೂ၂۱໓ࡱࠇᆀࢌ޺ଆൔ༯֥ૄ ၂ྛ׻൞၂۱ Chunkb ૄ۱ეओࢲແ֥ٳݼč;Ď൞ॖ࿊֥đ֌ೂݔ๝၂ྛႵ؟۱ეओቋݺႨĠٳष a = 1 b = a*2 -- ugly, but valid ၂۱ Chunk ॖၛ൞၂۱ეओđ္ॖၛ൞၂༢ਙეओ֥ቆކđߎॖၛ൞ݦඔđChunk ॖၛޓնđᄝ Lua ᇏࠫ۱ MByte ֥ Chunk ൞ޓӈ࡮֥b ୆ߎॖၛၛࢌ޺ଆൔᄎྛ Luađ҂ջҕඔᄎྛ Lua:
  14. Programming in Lua 6 Copyright ® 2005, Translation Team, www.luachina.net

    Lua 5.0 Copyright © 1994-2003 Tecgraf, PUC-Rio > ୆࡯ೆ֥ૄ۱ଁ਷čбೂğ"Hello World"Ďᄝ୆࡯ೆ߭Ӛᆭު৫ࠧФᆳྛđ࡯ೆ໓ ࡱࢲඏژॖၛ๼ԛࢌ޺ଆൔčCtrl-D in Unix, Ctrl-Z in DOS/WindowsĎ đࠇᆀטႨ OS ९ ֥ os.exit()ݦඔ္ॖၛ๼ԛb ᄝࢌ޺ଆൔ༯đLua ๙ӈϜૄ၂۱ྛ֒ቔ၂۱ Chunkđ֌ೂݔ Lua ၂ྛ҂൞၂۱ປ ᆜ֥ Chunk ൈđ෰߶֩ր࠿࿃ൻೆᆰ֤֞֞၂۱ປᆜ֥ Chunk.ᄝ Lua ֩ր࿃ྛൈđཁൕ ҂๝֥ิൕژč၂Ϯ൞>>Ď. ॖၛ๙ݖᆷקҕඔಞ Lua ᆳྛ၂༢ਙ Chunkb২ೂğࡌק၂۱໓ࡱ a ଽႵֆ۱ეओ x=1Ġਸ਼၂۱໓ࡱ b Ⴕეओ print(x) prompt> lua -la -lb ଁ਷൮༵ᄝ၂۱ Chunk ଽ༵ᄎྛ a ಖުᄎྛ bb čᇿၩğ-l ࿊ཛ߶טႨ requiređࡼ߶ ᄝᆷק֥ଢ੣༯ෆ෬໓ࡱđೂݔߌ࣢эਈીႵഡݺđഈ૫֥ଁ਷ॖି҂ିᆞಒᄎྛb໡ ૌࡼᄝ 8.1 ࢫབྷ༥۷བྷ༥֥ษં the require functionĎ -i ࿊ཛေ౰ Lua ᄎྛᆷק Chunk ުࣉೆࢌ޺ଆൔ. prompt> lua -i -la -lb ࡼᄝ၂۱ Chunk ଽ༵ᄎྛ a ಖުᄎྛ bđቋުᆰࢤࣉೆࢌ޺ଆൔb ਸ਼၂۱৵ࢤຓ҆ Chunk ֥ٚൔ൞൐Ⴈ dofile ݦඔđdofile ݦඔࡆᄛ໓ࡱѩᆳྛ෱.ࡌ ഡႵ၂۱໓ࡱ: -- file 'lib1.lua' function norm (x, y) local n2 = x^2 + y^2 return math.sqrt(n2) end function twice (x) return 2*x end ᄝࢌ޺ଆൔ༯ğ > dofile("lib1.lua") -- load your library > n = norm(3.4, 1.0) > print(twice(n)) --> 7.0880180586677 -i ބ dofile ᄝט൫ࠇᆀҩ൫ Lua ս઒ൈ൞ޓٚь֥b
  15. Programming in Lua 7 Copyright ® 2005, Translation Team, www.luachina.net

    1 1. .2 2 ಆ ಆअ अэ эਈ ਈ ಆअэਈ҂ླေലૼđ۳၂۱эਈڮᆴުࠧԷࡹਔᆃ۱ಆअэਈđ٠໙၂۱ીႵԚ ൓߄֥ಆअэਈ္҂߶ԛհđᆺ҂ݖ֤֥֞ࢲݔ൞ğnil. print(b) --> nil b = 10 print(b) --> 10 ೂݔ୆མ೷Ԣ၂۱ಆअэਈđᆺླေࡼэਈڵᆴູ nil b = nil print(b) --> nil ᆃဢэਈ b ࣼݺཞՖીФ൐Ⴈݖ၂ဢ.ߐओ߅ඪ, ֒౏ࣇ֒၂۱эਈ҂֩Ⴟ nil ൈđ ᆃ۱эਈթᄝb 1 1. .3 3 Ս Սم مჿ ჿק ק ѓൕژğሳଛ(letter)ࠇᆀ༯߃ཌष๨֥ሳଛa༯߃ཌaඔሳ྽ਙ.ቋݺ҂ေ൐Ⴈ༯߃ ཌࡆնཿሳଛ֥ѓൕژđၹູ Lua ֥Ќ਽ሳ္൞ᆃဢ֥bLua ᇏđletter ֥ݣၬ൞၇ঠႿ Чֹߌ࣢֥b Ќ਽ሳğၛ༯ሳژູ Lua ֥Ќ਽ሳđ҂ି֒ቔѓ്ژb and break do else elseif end false for function if in local nil not or repeat return then true until while ᇿၩğLua ൞նཬཿૹۋ֥. ᇿ൤ğֆྛᇿ൤:-- ؟ྛᇿ൤ğ--[[ --]] --[[ print(10) -- no action (comment) --]] 1 1. .4 4 ଁ ଁ਷ ਷ྛ ྛٚ ٚൔ ൔ lua [options] [script [args]]
  16. Programming in Lua 8 Copyright ® 2005, Translation Team, www.luachina.net

    -eğᆰࢤࡼଁ਷Ԯೆ Lua prompt> lua -e "print(math.sin(12))" --> -0.53657291800043 -lğࡆᄛ၂۱໓ࡱ. -iğࣉೆࢌ޺ଆൔ. _PROMPT ଽᇂэਈቔູࢌ޺ଆൔ֥ิൕژ prompt> lua -i -e "_PROMPT=' lua> '" lua> Lua ֥ᄎྛݖӱđᄝᄎྛҕඔᆭభđLua ߶Ұᅳߌ࣢эਈ LUA_INIT ֥ᆴđೂݔэ ਈթᄝѩ౏ᆴູ@filenameđLua ࡼࡆᄛᆷק໓ࡱbೂݔэਈթᄝ֌҂൞ၛ@ष๨đLua ࡌק filename ູ Lua ս઒໓ࡱѩ౏ᄎྛ෰b০Ⴈᆃ۱หྟđ໡ૌॖၛ๙ݖ஥ᇂđਲࠃ֥ ഡᇂࢌ޺ଆൔ֥ߌ࣢bॖၛࡆᄛЇđྩڿิൕژބਫ਼ࣥđקၬሱ֥࠭ݦඔđྩڿࠇᆀᇗ ଀଀ݦඔ֩b ಆअэਈ arg թ٢ Lua ֥ଁ਷ྛҕඔb prompt> lua script a b c ᄝᄎྛၛభđLua ൐Ⴈ෮Ⴕҕඔܒᄯ arg іb࢖Ч଀෬ႄູ 0đ࢖Ч֥ҕඔՖ 1 ष൓ ᄹࡆb࢖Чభ૫֥ҕඔՖ-1 ष൓ࡨഒb prompt> lua -e "sin=math.sin" script a b arg іೂ༯ğ arg[-3] = "lua" arg[-2] = "-e" arg[-1] = "sin=math.sin" arg[0] = "script" arg[1] = "a" arg[2] = "b"
  17. Programming in Lua 9 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 2 ᅣ ো྘ބᆴ Lua ൞׮෿ো྘ე࿽đ эਈ҂ေো྘קၬb Lua ᇏႵ 8 ۱ࠎЧো྘ٳљູğ nila booleana numberastringauserdataafunctionathread ބ tablebݦඔ type ॖၛҩ൫۳קэਈࠇᆀᆴ ֥ো྘b print(type("Hello world")) --> string print(type(10.4*3)) --> number print(type(print)) --> function print(type(type)) --> function print(type(true)) --> boolean print(type(nil)) --> nil print(type(type(X))) --> string эਈીႵყקၬ֥ো྘đૄ၂۱эਈ׻ॖିЇݣ಩၂ᇕো྘֥ᆴb print(type(a)) --> nil ('a' is not initialized) a = 10 print(type(a)) --> number a = "a string!!" print(type(a)) --> string a = print -- yes, this is valid! a(type(a)) --> function ᇿၩഈ૫ቋުਆྛđ໡ૌॖၛ൐Ⴈ function ཞ൐Ⴈః෰ᆴ၂ဢ൐Ⴈč۷؟֥ࢺകҕ ॉֻੂᅣĎ b၂Ϯ౦ঃ༯๝၂эਈսі҂๝ো྘֥ᆴ߶ᄯӮࠁ੹đቋݺ҂ေႨđ֌൞ห൹ ౦ঃ༯ॖၛջটь০đбೂ nilb 2 2. .1 1 N Ni il l Lua ᇏห൹֥ো྘đ ෰ᆺႵ၂۱ᆴğ nilĠ ၂۱ಆअэਈીႵФڮᆴၛభଏಪᆴູ nilĠ ۳ಆअэਈڵ nil ॖၛ೷Ԣھэਈb 2 2. .2 2 B Bo oo ol le ea an ns s ਆ۱౼ᆴ false ބ trueb֌ေᇿၩ Lua ᇏ෮Ⴕ֥ᆴ׻ॖၛቔ่ູࡱbᄝ॥ᇅࢲܒ่֥ ࡱᇏԢਔ false ބ nil ູࡌđః෰ᆴ׻ູᆇb෮ၛ Lua ಪູ 0 ބॢԱ׻൞ᆇb
  18. Programming in Lua 10 Copyright ® 2005, Translation Team, www.luachina.net

    2 2. .3 3 N Nu um mb be er rs s іൕൌඔđLua ᇏીႵᆜඔb၂ϮႵ۱հ༂֥ुم CPU ᄎෘڜׄඔбᆜඔતb൙ൌ ҂൞ೂՎđႨൌඔսูᆜඔ҂߶Ⴕ൉હ༂ҵčԢ٤ඔሳնႿ 100,000,000,000,000Ď bLua ֥ numbers ॖၛԩ৘಩ޅӉᆜඔ҂Ⴈքྏ༂ҵb୆္ॖၛᄝщၲ Lua ֥ൈީ൐ႨӉᆜ྘ ࠇᆀֆࣚ؇ڜׄ྘սู numbersđᄝ၂ུ௜෻႗ࡱ҂ᆦӻڜׄඔ֥౦ঃ༯ᆃ۱หྟ൞٤ ӈႵႨ֥đऎุ֥౦ঃ౨ҕॉ Lua ؿ҃ϱ෮ڸ֥བྷ༥ඪૼbބః෰ე࿽োරđඔሳӈਈ ֥ཬඔ҆ٳބᆷඔ҆ٳ׻൞ॖ࿊֥đඔሳӈਈ֥২ሰğ 4 0.4 4.57e-3 0.3e12 5e+20 2 2. .4 4 S St tr ri in ng gs s ᆷሳژ֥྽ਙb lua ൞ 8 ໊ሳࢫđ ෮ၛሳژԱॖၛЇݣ಩ޅඔᆴሳژđ Їওళೆ֥ 0b ᆃၩ໅ሢ୆ॖၛթԥ಩ၩ֥ؽࣉᇅඔऌᄝ၂۱ሳژԱ৚b Lua ᇏሳژԱ൞҂ॖၛྩڿ֥đ ୆ॖၛԷࡹ၂۱ྍ֥эਈթ٢୆ေ֥ሳژԱđೂ༯ğ a = "one string" b = string.gsub(a, "one", "another") -- change string parts print(a) --> one string print(b) --> another string string ބః෰ؓའ၂ဢđLua ሱ׮ࣉྛଽթٳ஥ބ൤٢đ၂۱ string ॖၛᆺЇݣ၂۱ ሳଛ္ॖၛЇݣ၂Ч඀đLua ॖၛི֥ۚԩ৘ӉሳژԱđ1M ֥ string ᄝ Lua ᇏ൞ޓӈ࡮ ֥bॖၛ൐ႨֆႄݼࠇᆀචႄݼіൕሳژԱ a = "a line" b = 'another line' ູਔڄ۬๤၂đቋݺ൐Ⴈ၂ᇕđԢ٤ਆᇕႄݼళส౦ঃbؓႿሳژԱᇏݣႵႄݼ֥ ౦ঃߎॖၛ൐Ⴈሇၬژ\টіൕbLua ᇏ֥ሇၬ྽ਙႵğ \a bell \b back space -- ު๼ \f form feed -- ߐ် \n newline -- ߐྛ \r carriage return -- ߭Ӛ \t horizontal tab -- ᇅі \v vertical tab \\ backslash -- "\" \" double quote -- චႄݼ \' single quote -- ֆႄݼ
  19. Programming in Lua 11 Copyright ® 2005, Translation Team, www.luachina.net

    \[ left square bracket -- ቐᇏওݼ \] right square bracket -- Ⴗᇏওݼ ২ሰğ > print("one line\nnext line\n\"in quotes\", 'in quotes'") one line next line "in quotes", 'in quotes' > print('a backslash inside quotes: \'\\\'') a backslash inside quotes: '\' > print("a simpler way: '\\'") a simpler way: '\' ߎॖၛᄝሳژԱᇏ൐Ⴈ\dddčddd ູ೘໊൅ࣉᇅඔሳĎٚൔіൕሳଛb "alo\n123\""ބ'\97lo\10\04923"'൞ཌྷ๝֥b ߎॖၛ൐Ⴈ[[...]]іൕሳژԱbᆃᇕྙൔ֥ሳژԱॖၛЇݣ؟ྛ္đॖၛళส౏҂߶ ࢳ൤ሇၬ྽ਙđೂݔֻ၂۱ሳژ൞ߐྛژ߶Фሱ׮ޭ੻וbᆃᇕྙൔ֥ሳژԱႨটЇݣ ၂؍ս઒൞٤ӈٚь֥b page = [[ <HTML> <HEAD> <TITLE>An HTML Page</TITLE> </HEAD> <BODY> Lua [[a text between double brackets]] </BODY> </HTML> ]] io.write(page) ᄎྛൈđLua ߶ሱ׮ᄝ string ބ numbers ᆭࡗሱ׮ࣉྛো྘ሇߐđ֒၂۱ሳژԱ൐ ႨෘඌҠቔژൈđstring ࣼ߶ФሇӮඔሳb print("10" + 1) --> 11 print("10 + 1") --> 10 + 1 print("-5.3e - 10" * "2") --> -1.06e-09 print("hello" + 1) -- ERROR (cannot convert "hello") ّݖটđ֒ Lua ௹ຬ၂۱ string طஷ֞ඔሳൈđ߶ࡼඔሳሇӮ stringb
  20. Programming in Lua 12 Copyright ® 2005, Translation Team, www.luachina.net

    print(10 .. 20) --> 1020 ..ᄝ Lua ᇏ൞ሳژԱ৵ࢤژđ֒ᄝ၂۱ඔሳު૫ཿ..ൈđсྶࡆഈॢ۬ၛٝᆸФࢳ൤ հb ࣐ܵሳژԱބඔሳॖၛሱ׮ሇߐđ֌ਆᆀ൞҂๝֥đཞ 10 == "10"ᆃဢ֥бࢠႥჹ ׻൞հ֥bೂݔླေཁൔࡼ string ሇӮඔሳॖၛ൐Ⴈݦඔ tonumber()đೂݔ string ҂൞ᆞ ಒ֥ඔሳھݦඔࡼْ߭ nilb line = io.read() -- read a line n = tonumber(line) -- try to convert it to a number if n == nil then error(line .. " is not a valid number") else print(n*2) end ّᆭ,ॖၛטႨ tostring()ࡼඔሳሇӮሳژԱđᆃᇕሇߐ၂ᆰႵིğ print(tostring(10) == "10") --> true print(10 .. "" == "10") --> true 2 2. .5 5 F Fu un nc ct ti io on ns s ݦඔ൞ֻ၂োᆴčބః෰эਈཌྷ๝Ď đၩ໅ሢݦඔॖၛթԥᄝэਈᇏđॖၛቔູݦඔ ֥ҕඔđ္ॖၛቔູݦඔْ֥߭ᆴbᆃ۱หྟ۳ਔე࿽ޓն֥ਲࠃྟğ၂۱ӱ྽ॖၛᇗ ྍקၬݦඔᄹࡆྍ֥ۿିࠇᆀູਔх૧ᄎྛ҂ॖौս઒Էࡹνಆᄎྛߌ࣢طႅҟݦඔđ Վຓᆃหྟᄝ Lua ൌགྷ૫ཟؓའᇏ္ఏਔᇗေቔႨčᄝֻ 16 ᅣབྷ༥ࢃඍĎ b Lua ॖၛטႨ lua ࠇᆀ C ൌགྷ֥ݦඔđLua ෮Ⴕѓሙ९׻൞Ⴈ C ൌགྷ֥bѓሙ९Ї ও string ९atable ९aI/O ९aOS ९aෘඌ९adebug ९b 2 2. .6 6 U Us se er rd da at ta a a an nd d T Th hr re ea ad ds s userdata ॖၛࡼ C ඔऌթ٢ᄝ Lua эਈᇏđ userdata ᄝ Lua ᇏԢਔڮᆴބཌྷ֩бࢠຓ ીႵყקၬ֥Ҡቔbuserdata Ⴈট૭ඍႋႨӱ྽ࠇᆀ൐Ⴈ C ൌགྷ֥९Էࡹ֥ྍো྘b২ ೂğႨѓሙ I/O ९ট૭ඍ໓ࡱb༯૫ᄝ C API ᅣࢫᇏ໡ૌࡼབྷ༥ษંb ᄝֻࣴᅣษંླྀ๝Ҡቔ֥ൈީđ໡ૌࢺകཌӱb
  21. Programming in Lua 13 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 3 ᅣ іղൔ Lua ᇏ֥іղൔЇওඔሳӈਈaሳژԱӈਈaэਈa၂ჭބؽჭᄎෘژaݦඔטႨb ߎॖၛ൞٤Ԯ๤֥ݦඔקၬބіܒᄯb 3 3. .1 1 ෘ ෘඌ ඌᄎ ᄎෘ ෘژ ژ ؽჭᄎෘژğ+ - * / ^ (ࡆࡨӰԢૢ) ၂ჭᄎෘژğ- (ڵᆴ) ᆃུᄎෘژ֥Ҡቔඔ׻൞ൌඔb 3 3. .2 2 ܱ ܱ༢ ༢ᄎ ᄎෘ ෘژ ژ < > <= >= == ~= ᆃུҠቔژْ߭ࢲݔູ false ࠇᆀ trueĠ==ބ~=бࢠਆ۱ᆴđೂݔਆ۱ᆴো྘҂๝đ Lua ಪູਆᆀ҂๝Ġnil ᆺބሱ࠭ཌྷ֩bLua ๙ݖႄႨбࢠ tablesauserdataafunctionsb ္ࣼ൞ඪ֒౏ࣇ֒ਆᆀіൕ๝၂۱ؓའൈཌྷ֩b a = {}; a.x = 1; a.y = 0 b = {}; b.x = 1; b.y = 0 c = a a==c but a~=b Lua бࢠඔሳοԮ๤֥ඔሳնཬࣉྛđбࢠሳژԱοሳଛ֥ඨ྽ࣉྛđ֌൞ሳଛඨ ྽၇ঠႿЧֹߌ࣢b ֒бࢠ҂๝ো྘֥ᆴ֥ൈީေหљᇿၩğ "0" == 0 -- false 2 < 15 -- true "2" < "15" -- false (alphabetical order!) ູਔх૧҂၂ᇁ֥ࢲݔđࠁކбࢠඔሳބሳژԱđLua ߶Бհđбೂğ2 < "15" 3 3. .3 3 આ આࠠ ࠠᄎ ᄎෘ ෘژ ژ and or not
  22. Programming in Lua 14 Copyright ® 2005, Translation Team, www.luachina.net

    આࠠᄎෘژಪູ false ބ nil ൞ࡌčfalseĎ đః෰ູᆇđ0 ္൞ true. and ބ or ֥ᄎෘࢲݔ҂൞ true ބ falseđط൞ބ෱֥ਆ۱Ҡቔඔཌྷܱb a and b -- ೂݔ a ູ falseđᄵْ߭ ađڎᄵْ߭ b a or b -- ೂݔ a ູ trueđᄵْ߭ ađڎᄵْ߭ b ২ೂğ print(4 and 5) --> 5 print(nil and 13) --> nil print(false and 13) --> false print(4 or 5) --> 4 print(false or 5) --> 5 ၂۱ޓൌႨ֥࠯ెğೂݔ x ູ false ࠇᆀ nil ᄵ۳ x ڮԚ൓ᆴ v x = x or v ֩ࡎႿ if not x then x = v end and ֥Ⴊ༵ࠩб or ۚb C ე࿽ᇏ֥೘ჭᄎෘژ a ? b : c ᄝ Lua ᇏॖၛᆃဢൌགྷğ (a and b) or c not ֥ࢲݔ၂ᆰْ߭ false ࠇᆀ true print(not nil) --> true print(not false) --> true print(not 0) --> false print(not not nil) --> false 3 3. .4 4 ৵ ৵ࢤ ࢤᄎ ᄎෘ ෘژ ژ .. --ਆ۱ׄ ሳژԱ৵ࢤđೂݔҠቔඔູඔሳđLua ࡼඔሳሇӮሳژԱb
  23. Programming in Lua 15 Copyright ® 2005, Translation Team, www.luachina.net

    print("Hello " .. "World") --> Hello World print(0 .. 1) --> 01 3 3. .5 5 Ⴊ Ⴊ༵ ༵ࠩ ࠩ Ֆ֥֮ۚ֞ඨ྽ğ ^ not - (unary) * / + - .. < > <= >= ~= == and or Ԣਔ^ބ..ຓ෮Ⴕ֥ؽჭᄎෘژ׻൞ቐ৵ࢤ֥b a+i < b/2+1 <--> (a+i) < ((b/2)+1) 5+x^2*8 <--> 5+((x^2)*8) a < y and y <= z <--> (a < y) and (y <= z) -x^2 <--> -(x^2) x^y^z <--> x^(y^z) 3 3. .6 6 і і֥ ֥ܒ ܒᄯ ᄯ ܒᄯఖ൞ԷࡹބԚ൓߄і֥іղൔbі൞ Lua หႵ֥ۿି఼ն֥ת༆bቋࡥֆ֥ܒ ᄯݦඔ൞{}đႨটԷࡹ၂۱ॢіbॖၛᆰࢤԚ൓߄ඔቆ: days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} Lua ࡼ"Sunday"Ԛ൓߄ days[1]čֻ၂۱ჭ෍෬ႄູ 1Ď đႨ"Monday"Ԛ൓߄ days[2]... print(days[4]) --> Wednesday ܒᄯݦඔॖၛ൐Ⴈ಩ޅіղൔԚ൓߄ğ tab = {sin(1), sin(2), sin(3), sin(4), sin(5),sin(6), sin(7), sin(8)} ೂݔམԚ൓߄၂۱іቔູ record ൐Ⴈॖၛᆃဢğ a = {x=0, y=0} <--> a = {}; a.x=0; a.y=0
  24. Programming in Lua 16 Copyright ® 2005, Translation Team, www.luachina.net

    ҂ܵႨޅᇕٚൔԷࡹ tableđ໡ૌ׻ॖၛཟіᇏเࡆࠇᆀ೷Ԣ಩ޅো྘֥თđܒᄯݦ ඔࣇࣇ႕ཙі֥Ԛ൓߄b w = {x=0, y=0, label="console"} x = {sin(0), sin(1), sin(2)} w[1] = "another field" x.f = w print(w["x"]) --> 0 print(w[1]) --> another field print(x.f[1]) --> another field w.x = nil -- remove field "x" ૄՑטႨܒᄯݦඔđLua ׻߶Էࡹ၂۱ྍ֥ tableđॖၛ൐Ⴈ table ܒᄯ၂۱ listğ list = nil for line in io.lines() do list = {next=list, value=line} end ᆃ؍ս઒Ֆѓሙൻೆ؀ࣉૄྛđಖުّ྽ྙӮ৽іb༯૫֥ս઒յႆ৽і֥ଽಸğ l = list while l do print(l.value) l = l.next end ᄝ๝၂۱ܒᄯݦඔᇏॖၛࠁކਙіڄ۬ބ record ڄ۬ࣉྛԚ൓߄đೂğ polyline = {color="blue", thickness=2, npoints=4, {x=0, y=0}, {x=-10, y=0}, {x=-10, y=1}, {x=0, y=1} } ᆃ۱২ሰ္іૼ໡ૌॖၛళสܒᄯݦඔটіൕگᄖ֥ඔऌࢲܒ. print(polyline[2].x) --> -10 ഈ૫ਆᇕܒᄯݦඔ֥Ԛ൓߄ٚൔߎႵཋᇅđбೂ୆҂ି൐Ⴈڵ෬ႄԚ൓߄၂۱іᇏ ჭ෍đሳژԱ෬ႄ္҂ିФఞ֥֒іൕb༯૫ࢺക၂ᇕ۷၂Ϯ֥Ԛ൓߄ٚൔđ໡ૌႨ [expression]ཁൕ֥іൕࡼФԚ൓߄֥෬ႄğ opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}
  25. Programming in Lua 17 Copyright ® 2005, Translation Team, www.luachina.net

    i = 20; s = "-" a = {[i+0] = s, [i+1] = s..s, [i+2] = s..s..s} print(opnames[s]) --> sub print(a[22]) --> --- list ڄ۬Ԛ൓߄ބ record ڄ۬Ԛ൓߄൞ᆃᇕ၂ϮԚ൓߄֥ห২: {x=0, y=0} <--> {["x"]=0, ["y"]=0} {"red", "green", "blue"} <--> {[1]="red", [2]="green", [3]="blue"} ೂݔᆇ֥མေඔቆ༯ѓՖ 0 ष൓ğ days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} ᇿၩğ҂๷ࡩඔቆ༯ѓՖ 0 ष൓đڎᄵޓ؟ѓሙ९҂ି൐Ⴈb ᄝܒᄯݦඔ֥ቋު֥","൞ॖ࿊֥đॖၛٚьၛު֥ঔᅚb a = {[1]="red", [2]="green", [3]="blue",} ᄝܒᄯݦඔᇏთٳۯژ׹ݼč","ĎॖၛႨٳݼč";"Ďูսđ๙ӈ໡ૌ൐ႨٳݼႨট ٳ۩҂๝ো྘֥іჭ෍b {x=10, y=45; "one", "two", "three"}
  26. Programming in Lua 18 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 4 ᅣ ࠎЧეم Lua ཞ C ބ PASCAL ࠫެᆦӻ෮Ⴕ֥Ԯ๤ეओğڮᆴეओa॥ᇅࢲܒეओaݦඔט Ⴈ֩đ๝ൈ္ᆦӻ٤Ԯ๤֥؟эਈڮᆴaअ҆эਈലૼb 4 4. .1 1 ڮ ڮᆴ ᆴე ეओ ओ ڮᆴ൞ڿэ၂۱эਈ֥ᆴބڿэіთ֥ቋࠎЧ֥ٚمb a = "hello" .. "world" t.n = t.n + 1 Lua ॖၛؓ؟۱эਈ๝ൈڮᆴđэਈਙіބᆴਙі֥۲۱ჭ෍Ⴈ׹ݼٳषđڮᆴე ओႷш֥ᆴ߶၇Ցڮ۳ቐш֥эਈb a, b = 10, 2*x <--> a=10; b=2*x მ֞ڮᆴეओ Lua ߶༵࠹ෘႷш෮Ⴕ֥ᆴಖުᄜᆳྛڮᆴҠቔđ෮ၛ໡ૌॖၛᆃဢ ࣉྛࢌߐэਈ֥ᆴğ x, y = y, x -- swap 'x' for 'y' a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[i]' ֒эਈ۱ඔބᆴ֥۱ඔ҂၂ᇁൈđLua ߶၂ᆰၛэਈ۱ඔູࠎԤҐ౼ၛ༯Ҧ੻ğ a. эਈ۱ඔ>ᆴ֥۱ඔ οэਈ۱ඔҀቀ nil b. эਈ۱ඔ<ᆴ֥۱ඔ ؟Ⴥ֥ᆴ߶Фޭ੻ ২ೂğ a, b, c = 0, 1 print(a,b,c) --> 0 1 nil a, b = a+1, b+1, b+2 -- value of b+2 is ignored print(a,b) --> 1 2 a, b, c = 0 print(a,b,c) --> 0 nil nil ഈ૫ቋު၂۱২ሰ൞၂۱ӈ࡮֥հ༂౦ঃđᇿၩğೂݔေؓ؟۱эਈڮᆴсྶ၇Ց ؓૄ۱эਈڮᆴb a, b, c = 0, 0, 0
  27. Programming in Lua 19 Copyright ® 2005, Translation Team, www.luachina.net

    print(a,b,c) --> 0 0 0 ؟ᆴڮᆴࣜӈႨটࢌߐэਈđࠇࡼݦඔטႨْ߭۳эਈğ a, b = f() f()ْ߭ਆ۱ᆴđֻ၂۱ڮ۳ ađֻؽ۱ڮ۳ bb 4 4. .2 2 अ अ҆ ҆э эਈ ਈა აս ս઒ ઒ॶ ॶč čb bl lo oc ck kĎ Ď ൐Ⴈ local Էࡹ၂۱अ҆эਈđ აಆअэਈ҂๝đ अ҆эਈᆺᄝФലૼ֥ପ۱ս઒ॶ ଽႵིbս઒ॶğᆷ၂۱॥ᇅࢲܒଽđ၂۱ݦඔุđࠇᆀ၂۱ chunkčэਈФലૼ֥ପ ۱໓ࡱࠇᆀ໓ЧԱĎ b x = 10 local i = 1 -- local to the chunk while i<=x do local x = i*2 -- local to the while body print(x) --> 2, 4, 6, 8, ... i = i + 1 end if i > 20 then local x -- local to the "then" body x = 20 print(x + 2) else print(x) --> 10 (the global one) end print(x) --> 10 (the global one) ᇿၩđ ೂݔᄝࢌ޺ଆൔ༯ഈ૫֥২ሰॖି҂ିൻԛ௹ຬ֥ࢲݔđ ၹֻູؽओ local i=1 ൞၂۱ປᆜ֥ chunkđᄝࢌ޺ଆൔ༯ᆳྛປᆃ၂ओުđLua ࡼष൓၂۱ྍ֥ chunkđᆃဢ ֻؽओ֥ i ၘࣜӑԛਔ෰֥Ⴕིٓຶbॖၛࡼᆃ؍ս઒٢ᄝ do..endčཌྷ֒Ⴟ c/c++֥{}Ď ॶᇏb ႋھ࣐ॖି֥൐Ⴈअ҆эਈđႵਆ۱ݺԩğ 1. х૧ଁ଀Ԋ๬ 2. ٠໙अ҆эਈ֥෎؇бಆअэਈ۷ॹ. ໡ૌ۳ block ߃ק၂۱ૼಒ֥ࢸཋğdo..end ଽ֥҆ٳb֒୆མ۷ݺ֥॥ᇅअ҆эਈ
  28. Programming in Lua 20 Copyright ® 2005, Translation Team, www.luachina.net

    ֥ቔႨٓຶ֥ൈީᆃ൞ޓႵႨ֥b do local a2 = 2*a local d = sqrt(b^2 - 4*a*c) x1 = (-b + d)/a2 x2 = (-b - d)/a2 end -- scope of 'a2' and 'd' ends here print(x1, x2) 4 4. .3 3 ॥ ॥ᇅ ᇅࢲ ࢲܒ ܒე ეओ ओ ॥ᇅࢲܒ่֥ࡱіղൔࢲݔॖၛ൞಩ޅᆴđLua ಪູ false ބ nil ູࡌđః෰ᆴູᆇb if ეओđႵ೘ᇕྙൔğ if conditions then then-part end; if conditions then then-part else else-part end; if conditions then then-part elseif conditions then elseif-part .. --->؟۱ elseif else else-part end; while ეओğ while condition do statements; end; repeat-until ეओğ
  29. Programming in Lua 21 Copyright ® 2005, Translation Team, www.luachina.net

    repeat statements; until conditions; for ეओႵਆնোğ ֻ၂đඔᆴ for ࿖ߌğ for var=exp1,exp2,exp3 do loop-part end for ࡼႨ exp3 ቔູ step Ֆ exp1čԚ൓ᆴĎ֞ exp2čᇔᆸᆴĎ đᆳྛ loop-partbఃᇏ exp3 ॖၛസ੻đଏಪ step=1 Ⴕࠫׄླေᇿၩğ 1. ೘۱іղൔᆺ߶Ф࠹ෘ၂Ցđѩ౏൞ᄝ࿖ߌष൓భb for i=1,f(x) do print(i) end for i=10,1,-1 do print(i) end ֻ၂۱২ሰ f(x)ᆺ߶ᄝ࿖ߌభФטႨ၂Ցb 2. ॥ᇅэਈ var ൞अ҆эਈሱ׮Фലૼ,ѩ౏ᆺᄝ࿖ߌଽႵི. for i=1,10 do print(i) end max = i -- probably wrong! 'i' here is global ೂݔླေЌ਽॥ᇅэਈ֥ᆴđླေᄝ࿖ߌᇏࡼఃЌթ -- find a value in a list local found = nil for i=1,a.n do if a[i] == value then found = i -- save value of 'i' break end end print(found)
  30. Programming in Lua 22 Copyright ® 2005, Translation Team, www.luachina.net

    3. ࿖ߌݖӱᇏ҂ေڿэ॥ᇅэਈ֥ᆴđପဢቓ֥ࢲݔ൞҂ॖყᆩ֥bೂݔေ๼ԛ࿖ ߌđ൐Ⴈ break ეओb ֻؽđٓ྘ for ࿖ߌğ భ૫ၘࣜ࡮ݖ၂۱২ሰğ -- print all values of array 'a' for i,v in ipairs(a) do print(v) end ٓ྘ for ђ৥םսሰݦඔْ֥߭ૄ၂۱ᆴb ᄜु၂۱ђ৥і key ֥২ሰğ -- print all keys of table 't' for k in pairs(t) do print(k) end ٓ྘ for ބඔᆴ for Ⴕਆׄཌྷ๝ğ 1. ॥ᇅэਈ൞अ҆эਈ 2. ҂ေྩڿ॥ᇅэਈ֥ᆴ ᄜु၂۱২ሰđࡌקႵ၂۱іğ days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} གྷᄝམϜؓႋ֥଀ሳሇߐӮྒ௹ࠫđ ၂۱Ⴕֹིࢳथ໙ี֥ٚൔ൞ܒᄯ၂۱ّཟіğ revDays = {["Sunday"] = 1, ["Monday"] = 2, ["Tuesday"] = 3, ["Wednesday"] = 4, ["Thursday"] = 5, ["Friday"] = 6, ["Saturday"] = 7} ༯૫ࣼॖၛޓಸၞࠆ౼໙ี֥ճσਔ: x = "Tuesday" print(revDays[x]) --> 3 ໡ૌ҂ླေ൭۽đॖၛሱ׮ܒᄯّཟі revDays = {} for i,v in ipairs(days) do revDays[v] = i end ೂݔ୆ؓٓ྘ for ߎႵུ҂ౢԣᄝު૫֥ᅣࢫ໡ૌ߶࠿࿃ট࿐༝b
  31. Programming in Lua 23 Copyright ® 2005, Translation Team, www.luachina.net

    4 4. .4 4 b br re ea ak k ބ ބ r re et tu ur rn n ე ეओ ओ break ეओႨট๼ԛ֒భ࿖ߌčfor,repeat,whileĎ bᄝ࿖ߌຓ҆҂ॖၛ൐Ⴈb return ႨটՖݦඔْ߭ࢲݔđ֒၂۱ݦඔሱಖࢲඏࢲແ߶Ⴕ၂۱ଏಪ֥ returnb čᆃ ᇕݦඔোර pascal ֥ݖӱĎ Lua ეمေ౰ break ބ return ᆺିԛགྷᄝ block ֥ࢲແ၂ओč္ࣼ൞ඪğቔູ chunk ֥ቋު၂ओđࠇᆀᄝ end ᆭభđࠇᆀ else భđࠇᆀ until భĎ đ২ೂğ local i = 1 while a[i] do if a[i] == v then break end i = i + 1 end Ⴕൈީູਔט൫ࠇᆀః෰ଢ֥ླေᄝ block ֥ᇏࡗ൐Ⴈ return ࠇᆀ breakđॖၛཁൔ ֥൐Ⴈ do..end টൌགྷğ function foo () return --<< SYNTAX ERROR -- 'return' is the last statement in the next block do return end -- OK ... -- statements not reached end
  32. Programming in Lua 24 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 5 ᅣ ݦඔ ݦඔႵਆᇕႨ๯ğ1.ປӮᆷק֥಩ༀđᆃᇕ౦ঃ༯ݦඔቔູטႨეओ൐ႨĠ2.࠹ෘѩ ْ߭ᆴđᆃᇕ౦ঃ༯ݦඔቔູڮᆴეओ֥іղൔ൐Ⴈb ეمğ function func_name (arguments-list) statements-list; end; טႨݦඔ֥ൈީđೂݔҕඔਙіູॢđсྶ൐Ⴈ()іૼ൞ݦඔטႨb print(8*9, 9/8) a = math.sin(3) + math.cos(10) print(os.date()) ഈඍܿᄵႵ၂۱২ຓđ֒ݦඔᆺႵ၂۱ҕඔѩ౏ᆃ۱ҕඔ൞ሳژԱࠇᆀіܒᄯ֥ൈ ީđ()൞ॖ࿊֥ğ print "Hello World" <--> print("Hello World") dofile 'a.lua' <--> dofile ('a.lua') print [[a multi-line <--> print([[a multi-line message]] message]]) f{x=10, y=20} <--> f({x=10, y=20}) type{} <--> type({}) Lua ္ิ܂ਔ૫ཟؓའٚൔטႨݦඔ֥ეمđбೂ o:foo(x)ა o.foo(o, x)൞֩ࡎ֥đ ު૫֥ᅣࢫ߶བྷ༥ࢺക૫ཟؓའଽಸb Lua ൐Ⴈ֥ݦඔॖၛ൞ Lua щཿ္ॖၛ൞ః෰ე࿽щཿđؓႿ Lua ӱ྽ჴটඪႨ൉ હე࿽ൌགྷ֥ݦඔ൐Ⴈఏট׻၂ဢb Lua ݦඔൌҕބྙҕ֥௄஥აڮᆴეओোරđ ؟Ⴥ҆ٳФޭ੻đ ಌഒ҆ٳႨ nil Ҁቀb function f(a, b) return a or b end CALL PARAMETERS f(3) a=3, b=nil f(3, 4) a=3, b=4 f(3, 4, 5) a=3, b=4 (5 is discarded)
  33. Programming in Lua 25 Copyright ® 2005, Translation Team, www.luachina.net

    5 5. .1 1 ْ ْ߭ ߭؟ ؟۱ ۱ࢲ ࢲݔ ݔᆴ ᆴ Lua ݦඔॖၛْ߭؟۱ࢲݔᆴđ бೂ string.findđ ఃْ߭௄஥Ա oष൓ބࢲඏ֥༯ѓp čೂݔ҂թᄝ௄஥Աْ߭ nilĎ b s, e = string.find("hello Lua users", "Lua") print(s, e) --> 7 9 Lua ݦඔᇏđᄝ return ުਙԛေْ֥߭ᆴ֤ਙіࠧॖْ߭؟ᆴđೂğ function maximum (a) local mi = 1 -- maximum index local m = a[mi] -- maximum value for i,val in ipairs(a) do if val > m then mi = i m = val end end return m, mi end print(maximum({8,10,23,12,5})) --> 23 3 Lua ሹ൞טᆜݦඔْ߭ᆴ֥۱ඔಀൡႨטႨߌ࣢đ֒ቔູ၂۱ეओטႨݦඔൈđ෮ Ⴕْ߭ᆴФޭ੻bࡌഡႵೂ༯೘۱ݦඔğ function foo0 () end -- returns no results function foo1 () return 'a' end -- returns 1 result function foo2 () return 'a','b' end -- returns 2 results ֻ၂đ֒ቔູіղൔטႨݦඔൈđႵၛ༯ࠫᇕ౦ঃğ 1. ֒טႨቔູіղൔቋު၂۱ҕඔࠇᆀࣇႵ၂۱ҕඔൈđ ۴ऌэਈ۱ඔݦඔ࣐ॖି ؟ֹْ߭؟۱ᆴđ҂ቀҀ nilđӑԛചಀb 2. ః෰౦ঃ༯đݦඔטႨࣇֻْ߭၂۱ᆴčೂݔીႵْ߭ᆴູ nilĎ x,y = foo2() -- x='a', y='b' x = foo2() -- x='a', 'b' is discarded x,y,z = 10,foo2() -- x=10, y='a', z='b' x,y = foo0() -- x=nil, y=nil x,y = foo1() -- x='a', y=nil x,y,z = foo2() -- x='a', y='b', z=nil
  34. Programming in Lua 26 Copyright ® 2005, Translation Team, www.luachina.net

    x,y = foo2(), 20 -- x='a', y=20 x,y = foo0(), 20, 30 -- x='nil', y=20, 30 is discarded ֻؽđݦඔטႨቔູݦඔҕඔФטႨൈđބ؟ᆴڮᆴ൞ཌྷ๝b print(foo0()) --> print(foo1()) --> a print(foo2()) --> a b print(foo2(), 1) --> a 1 print(foo2() .. "x") --> ax ֻ೘đݦඔטႨᄝіܒᄯݦඔᇏԚ൓߄ൈđބ؟ᆴڮᆴൈཌྷ๝b a = {foo0()} -- a = {} (an empty table) a = {foo1()} -- a = {'a'} a = {foo2()} -- a = {'a', 'b'} a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4 ਸ਼ຓđreturn f()ᆃᇕো྘ْ֥߭ f()ْ֥߭෮Ⴕᆴ function foo (i) if i == 0 then return foo0() elseif i == 1 then return foo1() elseif i == 2 then return foo2() end end print(foo(1)) --> a print(foo(2)) --> a b print(foo(0)) -- (no results) print(foo(3)) -- (no results) ॖၛ൐Ⴈჵওݼ఼ᇅ൐טႨْ߭၂۱ᆴb print((foo0())) --> nil print((foo1())) --> a print((foo2())) --> a ၂۱ return ეओೂݔ൐Ⴈჵওݼࡼْ߭ᆴওఏট္ࡼ֝ᇁْ߭၂۱ᆴb ݦඔ؟ᆴْ֥߭ห൹ݦඔ unpackđࢤ൳၂۱ඔቆቔູൻೆҕඔđْ߭ඔቆ֥෮Ⴕჭ ෍bunpack ФႨটൌགྷٓ྘טႨࠏᇅđᄝ C ე࿽ᇏॖၛ൐ႨݦඔᆷᆌטႨॖэ֥ݦඔđ ॖၛലૼҕඔॖэ֥ݦඔđ֌҂ିਆᆀ๝ൈॖэbᄝ Lua ᇏೂݔ୆མטႨॖэҕඔ֥ॖ эݦඔᆺླေᆃဢğ
  35. Programming in Lua 27 Copyright ® 2005, Translation Team, www.luachina.net

    f(unpack(a)) unpack ْ߭ a ෮Ⴕ֥ჭ෍ቔູ f()֥ҕඔ f = string.find a = {"hello", "ll"} print(f(unpack(a))) --> 3 4 ყקၬ֥ unpack ݦඔ൞Ⴈ C ე࿽ൌགྷ֥đ໡ૌ္ॖၛႨ Lua টປӮğ function unpack(t, i) i = i or 1 if t[i] then return t[i], unpack(t, i + 1) end end 5 5. .2 2 ॖ ॖэ эҕ ҕඔ ඔ Lua ݦඔॖၛࢤ൳ॖэඔଢ֥ҕඔđބ C ე࿽োරᄝݦඔҕඔਙіᇏ൐Ⴈ೘ׄč...Ď іൕݦඔႵॖэ֥ҕඔbLua ࡼݦඔ֥ҕඔ٢ᄝ၂۱ࢡ arg ֥іᇏđԢਔҕඔၛຓđarg іᇏߎႵ၂۱თ n іൕҕඔ֥۱ඔb ২ೂđ໡ૌॖၛᇗཿ print ݦඔğ printResult = "" function print(...) for i,v in ipairs(arg) do printResult = printResult .. tostring(v) .. "\t" end printResult = printResult .. "\n" end Ⴕൈީ໡ૌॖିླေࠫ۱ܥקҕඔࡆഈॖэҕඔ function g (a, b, ...) end CALL PARAMETERS g(3) a=3, b=nil, arg={n=0} g(3, 4) a=3, b=4, arg={n=0} g(3, 4, 5, 8) a=3, b=4, arg={5, 8; n=2}
  36. Programming in Lua 28 Copyright ® 2005, Translation Team, www.luachina.net

    ೂഈ૫෮ൕđLua ߶ࡼభ૫֥ൌҕԮ۳ݦඔ֥ܥקҕඔđު૫֥ൌҕ٢ᄝ arg іᇏb ई۱ऎุ֥২ሰđೂݔ໡ૌᆺམေ string.find ֻْ֥߭ؽ۱ᆴğ ၂۱ׅ྘֥ٚم൞൐Ⴈྴэਈč༯߃ཌĎ local _, x = string.find(s, p) -- now use `x' ... ߎॖၛ০Ⴈॖэҕඔലૼ၂۱ select ݦඔğ function select (n, ...) return arg[n] end print(string.find("hello hello", " hel")) --> 6 9 print(select(1, string.find("hello hello", " hel"))) --> 6 print(select(2, string.find("hello hello", " hel"))) --> 9 Ⴕൈީླေࡼݦඔ֥ॖэҕඔԮ־۳ਸ਼ຓ֥ݦඔטႨđॖၛ൐Ⴈభ૫໡ૌඪݖ֥ unpack(arg)ْ߭ arg і෮Ⴕ֥ॖэҕඔđLua ิ܂ਔ၂۱໓Ч۬ൔ߄֥ݦඔ string.format čোර C ე࿽֥ sprintf ݦඔĎ ğ function fwrite(fmt, ...) return io.write(string.format(fmt, unpack(arg))) end ᆃ۱২ሰࡼ໓Ч۬ൔ߄ҠቔބཿҠቔቆކູ၂۱ݦඔb 5 5. .3 3 ଁ ଁ଀ ଀ҕ ҕඔ ඔ Lua ֥ݦඔҕඔ൞ބ໊ᇂཌྷܱ֥đטႨൈൌҕ߶οඨ྽၇ՑԮ۳ྙҕbႵൈީႨ଀ ሳᆷקҕඔ൞ޓႵႨ֥đ бೂ rename ݦඔႨট۳၂۱໓ࡱᇗଁ଀đ Ⴕൈީ໡ૌ໡ૌ࠺҂ ౢଁ଀భުਆ۱ҕඔ֥ඨ྽ਔğ -- invalid code rename(old="temp.lua", new="temp1.lua") ഈ૫ᆃ؍ս઒൞໭ི֥đLua ॖၛ๙ݖࡼ෮Ⴕ֥ҕඔ٢ᄝ၂۱іᇏđϜіቔູݦඔ ֥ື၂ҕඔটൌགྷഈ૫ᆃ؍ເս઒֥ۿିbၹູ Lua ეمᆦӻݦඔטႨൈൌҕॖၛ൞і ֥ܒᄯb rename{old="temp.lua", new="temp1.lua"} ۴ऌᆃ۱མم໡ૌᇗקၬਔ renameğ
  37. Programming in Lua 29 Copyright ® 2005, Translation Team, www.luachina.net

    function rename (arg) return os.rename(arg.old, arg.new) end ֒ݦඔ֥ҕඔޓ؟֥ൈީđᆃᇕݦඔҕඔ֥Ԯ־ٚൔޓٚь֥b২ೂ GUI ९ᇏԷࡹ Գุ֥ݦඔႵޓ؟ҕඔѩ౏ն҆ٳҕඔ൞ॖ࿊֥đॖၛႨ༯૫ᆃᇕٚൔğ w = Window { x=0, y=0, width=300, height=200, title = "Lua", background="blue", border = true } function Window (options) -- check mandatory options if type(options.title) ~= "string" then error("no title") elseif type(options.width) ~= "number" then error("no width") elseif type(options.height) ~= "number" then error("no height") end -- everything else is optional _Window(options.title, options.x or 0, -- default value options.y or 0, -- default value options.width, options.height, options.background or "white", -- default options.border -- default is false (nil) ) end
  38. Programming in Lua 30 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 6 ᅣ ᄜંݦඔ Lua ᇏ֥ݦඔ൞ջႵՍمקࢸčlexical scopingĎֻ֥၂োᆴčfirst-class valuesĎ b ֻ၂োᆴᆷğᄝ Lua ᇏݦඔބః෰ᆴčඔᆴaሳژԱĎ၂ဢđݦඔॖၛФթ٢ᄝэ ਈᇏđ္ॖၛթ٢ᄝіᇏđॖၛቔູݦඔ֥ҕඔđߎॖၛቔູݦඔْ֥߭ᆴb ՍمקࢸᆷğФళส֥ݦඔॖၛ٠໙෰ຓ҆ݦඔᇏ֥эਈbᆃ၂หྟ۳ Lua ิ܂ਔ ఼ն֥щӱି৯b Lua ᇏܱႿݦඔ഍ັ଴ၛ৘ࢳ֥൞ݦඔ္ॖၛીႵ଀ሳđେ଀֥b֒໡ૌิ֞ݦඔ ଀čбೂ printĎ đൌ࠽ഈ൞ඪ၂۱ᆷཟݦඔ֥эਈđཞӻႵః෰ো྘ᆴ֥эਈ၂ဢğ a = {p = print} a.p("Hello World") --> Hello World print = math.sin -- `print' now refers to the sine function a.p(print(1)) --> 0.841470 sin = a.p -- `sin' now refers to the print function sin(10, 20) --> 10 20 ࠻ಖݦඔ൞ᆴđପહіղൔ္ॖၛԷࡹݦඔਔđLua ᇏ໡ૌࣜӈᆃဢཿğ function foo (x) return 2*x end ᆃൌ࠽ഈ൞০Ⴈ Lua ิ܂֥oეمഈ֥ใ๨p čsyntactic sugarĎ֥ࢲݔđ༯૫൞ჰ Ч֥ݦඔğ foo = function (x) return 2*x end ݦඔקၬൌ࠽ഈ൞၂۱ڮᆴეओđࡼো྘ູ function ֥эਈڮ۳၂۱эਈb໡ૌ൐ Ⴈ function (x) ... end টקၬ၂۱ݦඔބ൐Ⴈ{}Էࡹ၂۱і၂ဢb table ѓሙ९ิ܂၂۱ஆ྽ݦඔđࢤ൳၂۱іቔູൻೆҕඔѩ౏ஆ྽іᇏ֥ჭ෍bᆃ ۱ݦඔсྶିܔؓ҂๝ো྘֥ᆴčሳژԱࠇᆀඔᆴĎοശ྽ࠇᆀࢆ྽ࣉྛஆ྽bLua ҂ ൞࣐ॖି؟ֹิ܂ҕඔটડቀᆃུ౦ঃ֥ླေđط൞ࢤ൳၂۱ஆ྽ݦඔቔູҕඔčোර C++֥ݦඔؓའĎ đ ஆ྽ݦඔࢤ൳ਆ۱ஆ྽ჭ෍ቔູൻೆҕඔđ ѩ౏ْ߭ਆᆀ֥նཬܱ༢đ ২ೂğ network = { {name = "grauna", IP = "210.26.30.34"}, {name = "arraial", IP = "210.26.30.23"}, {name = "lua", IP = "210.26.23.12"}, {name = "derain", IP = "210.26.23.20"}, }
  39. Programming in Lua 31 Copyright ® 2005, Translation Team, www.luachina.net

    ೂݔ໡ૌམ๙ݖі֥ name თஆ྽ğ table.sort(network, function (a,b) return (a.name > b.name) end) ၛః෰ݦඔቔູҕඔ֥ݦඔᄝ Lua ᇏФӫቔۚࠩݦඔđۚࠩݦඔᄝ Lua ᇏѩીႵห ಃđᆺ൞ Lua Ϝݦඔ֒ቔֻ၂োݦඔԩ৘֥၂۱ࡥֆ֥ࢲݔb ༯૫۳ԛ၂۱߻๭ݦඔ֥২ሰğ function eraseTerminal() io.write("\27[2J") end -- writes an `*' at column `x' , row `y' function mark (x,y) io.write(string.format("\27[%d;%dH*", y, x)) end -- Terminal size TermSize = {w = 80, h = 24} -- plot a function -- (assume that domain and image are in the range [-1,1]) function plot (f) eraseTerminal() for i=1,TermSize.w do local x = (i/TermSize.w)*2 - 1 local y = (f(x) + 1)/2 * TermSize.h mark(i, y) end io.read() -- wait before spoiling the screen end ေམಞᆃ۱২ሰᆞಒ֥ᄎྛđ୆сྶטᆜ୆֥ᇔ؊ো྘ބս઒ᇏ֥॥ᇅژ၂ᇁğ plot(function (x) return math.sin(x*2*math.pi) end) ࡼᄝ௠ଞഈൻԛ၂۱ᆞ༿౷ཌb ࡼֻ၂োᆴݦඔႋႨᄝіᇏ൞ Lua ൌགྷ૫ཟؓའބЇࠏᇅ֥ܱ࡯đᆃ҆ٳଽಸᄝު ૫ᅣࢫࢺകb
  40. Programming in Lua 32 Copyright ® 2005, Translation Team, www.luachina.net

    6 6. .1 1 о оЇ Ї ֒၂۱ݦඔଽ҆ళสਸ਼၂۱ݦඔקၬൈđଽ֥҆ݦඔุॖၛ٠໙ຓ֥҆ݦඔ֥अ҆ эਈđᆃᇕหᆘ໡ૌӫቔՍمקࢸbෙಖᆃुఏটޓౢԣđ൙ൌѩ٤ೂՎđՍمקࢸࡆ ഈֻ၂োݦඔᄝщӱე࿽৚൞၂۱ۿି఼ն֥ۀ୑đޓഒე࿽ิ܂ᆃᇕᆦӻb ༯૫ु၂۱ࡥֆ֥২ሰđ ࡌקႵ၂۱࿐ളྠ଀֥ਙіބ၂۱࿐ള଀ބӮࠛؓႋ֥іĠ གྷᄝམ۴ऌ࿐ള֥ӮࠛՖ֮ۚ֞ؓ࿐ളࣉྛஆ྽đॖၛᆃဢቓğ names = {"Peter", "Paul", "Mary"} grades = {Mary = 10, Paul = 7, Peter = 8} table.sort(names, function (n1, n2) return grades[n1] > grades[n2] -- compare the grades end) ࡌקԷࡹ၂۱ݦඔൌགྷՎۿିğ function sortbygrade (names, grades) table.sort(names, function (n1, n2) return grades[n1] > grades[n2] -- compare the grades end) end ২ሰᇏЇݣᄝ sortbygrade ݦඔଽ֥҆ sort ᇏ֥େ଀ݦඔॖၛ٠໙ sortbygrade ֥ҕඔ gradesđᄝେ଀ݦඔଽ҆ grades ҂൞ಆअэਈ္҂൞अ҆эਈđ໡ૌӫቔຓ֥҆अ҆э ਈčexternal local variableĎࠇᆀ upvalueb čupvalue ၩනႵུ༂֝đಖطᄝ Lua ᇏ෰֥թ ᄝႵ৥ൎ֥۴ჷđߎႵ෰бఏ external local variable ࡥ؋Ď b ु༯૫֥ս઒ğ function newCounter() local i = 0 return function() -- anonymous function i = i + 1 return i end end c1 = newCounter() print(c1()) --> 1 print(c1()) --> 2 େ଀ݦඔ൐Ⴈ upvalue i Ќթ෰֥࠹ඔđ֒໡ૌטႨେ଀ݦඔ֥ൈީ i ၘࣜӑԛਔቔ ႨٓຶđၹູԷࡹ i ֥ݦඔ newCounter ၘْࣜ߭ਔbಖط Lua ႨоЇ֥නམᆞಒԩ৘ਔ
  41. Programming in Lua 33 Copyright ® 2005, Translation Team, www.luachina.net

    ᆃᇕ౦ঃbࡥֆ֥ඪоЇ൞၂۱ݦඔࡆഈ෱ॖၛᆞಒ٠໙֥ upvaluesbೂݔ໡ૌᄜՑט Ⴈ newCounterđ ࡼԷࡹ၂۱ྍ֥अ҆эਈ iđ ၹՎ໡ૌ֤֞ਔ၂۱ቔႨᄝྍ֥эਈ i ഈ֥ ྍоЇb c2 = newCounter() print(c2()) --> 1 print(c1()) --> 3 print(c2()) --> 2 c1ac2 ൞ࡹ৫ᄝ๝၂۱ݦඔഈđ֌ቔႨᄝ๝၂۱अ҆эਈ֥҂๝ൌ২ഈ֥ਆ۱҂๝ ֥оЇb ࠯ඌഈটࢃđоЇᆷᆴط҂൞ᆷݦඔđݦඔࣇࣇ൞оЇ֥၂۱ჰ྘ലૼĠ࣐ܵೂՎđ ᄝ҂߶֝ᇁࠁཪ֥౦ঃ༯໡ૌ࠿࿃൐ႨඌეݦඔսᆷоЇb оЇᄝഈ༯໓ߌ࣢ᇏิ܂ޓႵႨ֥ۿିđ ೂభ૫໡ૌ࡮֥֞ॖၛቔູۚࠩݦඔ čsortĎ ֥ҕඔĠቔູݦඔళส֥ݦඔčnewCounterĎ bᆃ၂ࠏᇅ൐֤໡ૌॖၛᄝ Lua ֥ݦඔൗࢸ ৚ቆކԛఅߘ֥щӱ࠯ඌbоЇ္ॖႨᄝ߭טݦඔᇏđбೂᄝ GUI ߌ࣢ᇏ୆ླေԷࡹ၂ ༢ਙ buttonđ֌Ⴈ޼ο༯ button ൈ߭טݦඔФטႨđॖି҂๝֥ο୦Фο༯ൈླေԩ৘ ֥಩ༀႵׄ౵љbऎุটࢃđ၂۱൅ࣉᇅ࠹ෘఖླေ 10 ۱ཌྷර֥ο୦đૄ۱ο୦ؓႋ၂ ۱ඔሳđॖၛ൐Ⴈ༯૫֥ݦඔԷࡹ෰ૌğ function digitButton (digit) return Button{ label = digit, action = function () add_to_display(digit) end } end ᆃ۱২ሰᇏ໡ૌࡌק Button ൞၂۱ႨটԷࡹྍο୦֥۽ऎđ label ൞ο୦֥ѓదđ action ൞ο୦Фο༯ൈטႨ֥߭טݦඔb čൌ࠽ഈ൞၂۱оЇđ ၹູ෰٠໙ upvalue digitĎ b digitButton ປӮ಩ༀْ߭ުđअ҆эਈ digit ӑԛٓຶđ߭טݦඔಯಖॖၛФטႨѩ౏ॖ ၛ٠໙अ҆эਈ digitb оЇᄝປಆ҂๝֥ഈ༯໓ᇏ္൞ޓႵႨ๯֥bၹູݦඔФթԥᄝ௴๙֥эਈଽ໡ૌ ॖၛޓٚь֥ᇗקၬࠇᆀყקၬݦඔb๙ӈ֒୆ླေჰ൓ݦඔႵ၂۱ྍ֥ൌགྷൈॖၛᇗ קၬݦඔb২ೂ୆ॖၛᇗקၬ sin ൐ఃࢤ൳၂۱؇ඔط҂൞޶؇ቔູҕඔğ oldSin = math.sin math.sin = function (x) return oldSin(x*math.pi/180) end ۷ౢԣ֥ٚൔğ
  42. Programming in Lua 34 Copyright ® 2005, Translation Team, www.luachina.net

    do local oldSin = math.sin local k = math.pi/180 math.sin = function (x) return oldSin(x*k) end end ᆃဢ໡ૌϜჰ൓ϱЧ٢ᄝ၂۱अ҆эਈଽđ٠໙ sin ֥ື၂ٚൔ൞๙ݖྍϱЧ֥ݦ ඔb ০Ⴈ๝ဢ֥หᆘ໡ૌॖၛԷࡹ၂۱νಆ֥ߌ࣢ č္ӫቔ೬དđ ބ java ৚֥೬ད၂ဢĎ đ ֒໡ૌᄎྛ၂؍҂ྐ಩֥ս઒čбೂ໡ૌᄎྛຩ઎ڛༀఖഈࠆ౼֥ս઒Ďൈνಆ֥ߌ࣢ ൞ླေ֥đбೂ໡ૌॖၛ൐ႨоЇᇗקၬ io ९֥ open ݦඔটཋᇅӱ྽յष֥໓ࡱb do local oldOpen = io.open io.open = function (filename, mode) if access_OK(filename, mode) then return oldOpen(filename, mode) else return nil, "access denied" end end end 6 6. .2 2 ٤ ٤ಆ ಆअ अݦ ݦඔ ඔ Lua ᇏݦඔॖၛቔູಆअэਈ္ॖၛቔູअ҆эਈđ໡ૌၘࣜु֞၂ུ২ሰğݦඔ ቔູ table ֥თčն҆ٳ Lua ѓሙ९൐Ⴈᆃᇕࠏᇅটൌགྷ֥бೂ io.readamath.sinĎ bᆃᇕ ౦ঃ༯đсྶᇿၩݦඔބіეمğ 1. іބݦඔ٢ᄝ၂ఏ Lib = {} Lib.foo = function (x,y) return x + y end Lib.goo = function (x,y) return x - y end 2. ൐Ⴈіܒᄯݦඔ Lib = { foo = function (x,y) return x + y end, goo = function (x,y) return x - y end
  43. Programming in Lua 35 Copyright ® 2005, Translation Team, www.luachina.net

    } 3. Lua ิ܂ਸ਼၂ᇕეمٚൔ Lib = {} function Lib.foo (x,y) return x + y end function Lib.goo (x,y) return x - y end ֒໡ૌࡼݦඔЌթᄝ၂۱अ҆эਈଽൈđ໡ૌ֤֞၂۱अ҆ݦඔđ္ࣼ൞ඪअ҆ݦ ඔཞअ҆эਈ၂ဢᄝ၂קٓຶଽႵིb ᆃᇕקၬᄝЇᇏ൞٤ӈႵႨ֥ğ ၹູ Lua Ϝ chunk ֒ቔݦඔԩ৘đᄝ chunk ଽॖၛലૼअ҆ݦඔčࣇࣇᄝ chunk ଽॖ࡮Ď đՍمקࢸЌᆣਔ Їଽ֥ః෰ݦඔॖၛטႨՎݦඔb༯૫൞ലૼअ҆ݦඔ֥ਆᇕٚൔğ 1. ٚൔ၂ local f = function (...) ... end local g = function (...) ... f() -- external local `f' is visible here ... end 2. ٚൔؽ local function f (...) ... end Ⴕ၂ׄླေᇿၩ֥൞ᄝലૼ־݂अ҆ݦඔ֥ٚൔğ local fact = function (n) if n == 0 then return 1 else return n*fact(n-1) -- buggy end end ഈ૫ᆃᇕٚൔ֝ᇁ Lua щၲൈმ֞ fact(n-1)ѩ҂ᆩ֡෰൞अ҆ݦඔ factđ Lua ߶ಀҰ
  44. Programming in Lua 36 Copyright ® 2005, Translation Team, www.luachina.net

    ᅳ൞ڎႵᆃဢ֥ಆअݦඔ factbູਔࢳथᆃ۱໙ี໡ૌсྶᄝקၬݦඔၛభ༵ലૼğ local fact fact = function (n) if n == 0 then return 1 else return n*fact(n-1) end end ᆃဢᄝ fact ଽ҆ fact(n-1)טႨ൞၂۱अ҆ݦඔטႨđᄎྛൈ fact ࣼॖၛࠆ౼ᆞಒ֥ ᆴਔb ֌൞ Lua ঔᅚਔ෰֥ეم൐֤ॖၛᄝᆰࢤ־݂ݦඔקၬൈ൐Ⴈਆᇕٚൔ׻ॖၛb ᄝקၬ٤ᆰࢤ־݂अ҆ݦඔൈေ༵ലૼಖުקၬҌॖၛğ local f, g -- `forward' declarations function g () ... f() ... end function f () ... g() ... end 6 6. .3 3 ᆞ ᆞಒ ಒ֥ ֥ແ ແט טႨ Ⴈč čP Pr ro op pe er r T Ta ai il l C Ca al ll ls sĎ Ď Lua ᇏݦඔ֥ਸ਼၂۱Ⴕ౿֥หᆘ൞ॖၛᆞಒ֥ԩ৘ແטႨčproper tail recursionđ၂ ུ඀൐Ⴈඌეoແ־݂p đෙಖѩໃടࠣ֞־݂֥ۀ୑Ď b ແטႨ൞၂ᇕোරᄝݦඔࢲແ֥ goto טႨđ ֒ݦඔቋު၂۱׮ቔ൞טႨਸ਼ຓ၂۱ݦ ඔൈđ໡ૌӫᆃᇕטႨແטႨb২ೂğ function f(x) return g(x) end g ֥טႨ൞ແטႨb ২ሰᇏ f טႨ g ު҂߶ᄜቓ಩ޅ൙౦đᆃᇕ౦ঃ༯֒ФטႨݦඔ g ࢲඏൈӱ྽҂ླ ေْ߭֞טႨᆀ fĠ෮ၛແטႨᆭުӱ྽҂ླေᄝᅜᇏЌ਽ܱႿטႨᆀ֥಩ޅྐ༏b၂
  45. Programming in Lua 37 Copyright ® 2005, Translation Team, www.luachina.net

    ུщၲఖбೂ Lua ࢳ൤ఖ০Ⴈᆃᇕหྟᄝԩ৘ແטႨൈ҂൐Ⴈحຓ֥ᅜđ໡ૌӫᆃᇕე ࿽ᆦӻᆞಒ֥ແטႨb ႮႿແטႨ҂ླေ൐ႨᅜॢࡗđପહແטႨ־݂֥ҪՑॖၛ໭ཋᇅ֥b২ೂ༯૫ט Ⴈ҂ં n ູޅᆴ҂߶֝ᇁᅜၮԛb function foo (n) if n > 0 then return foo(n - 1) end end ླေᇿၩ֥൞ğсྶૼಒ൉હ൞ແטႨb ၂ུטႨᆀݦඔטႨః෰ݦඔު္ીႵቓః෰֥൙౦֌҂උႿແטႨbбೂğ function f (x) g(x) return end ഈ૫ᆃ۱২ሰᇏ f ᄝטႨ g ުđ҂֤҂שఙ g ֹْ߭ᆴđ෮ၛ҂൞ແטႨđ๝ဢ֥ ༯૫ࠫ۱২ሰ္҂ൈແטႨğ return g(x) + 1 -- must do the addition return x or g(x) -- must adjust to 1 result return (g(x)) -- must adjust to 1 result Lua ᇏোර return g(...)ᆃᇕ۬ൔ֥טႨ൞ແטႨb֌൞ g ބ g ֥ҕඔ׻ॖၛ൞گᄖ іղൔđၹູ Lua ߶ᄝטႨᆭభ࠹ෘіղൔ֥ᆴb২ೂ༯૫֥טႨ൞ແטႨğ return x[i].foo(x[j] + a*b, i + j) ॖၛࡼແטႨ৘ࢳӮ၂ᇕ gotođᄝሑ෿ࠏ֥щӱਵთແטႨ൞٤ӈႵႨ֥bሑ෿ࠏ ֥ႋႨေ౰ݦඔ࠺ᇾૄ၂۱ሑ෿đڿэሑ෿ᆺླေ goto(or call)၂۱หק֥ݦඔb໡ૌॉ ੮၂۱૙܅Ⴓ༤ቔູ২ሰğ૙܅Ⴕޓ؟۱ٜࡗđૄ۱ٜࡗႵת༆ଲКඹ۱૊đૄ၂҄ൻ ೆ၂۱၍׮֥ٚཟđ ೂݔھٚཟթᄝࠧ֞ղھٚཟؓႋ֥ٜࡗđ ڎᄵӱ྽յႆࣞۡྐ༏b ଢѓ൞ğՖष൓֥ٜࡗ֞ղଢ֥ٜࡗb ᆃ۱૙܅Ⴓ༤൞ׅ྘֥ሑ෿ࠏđૄ۱֒భ֥ٜࡗ൞၂۱ሑ෿b໡ૌॖၛؓૄ۱ٜࡗ ཿ၂۱ݦඔൌགྷᆃ۱૙܅Ⴓ༤đ໡ૌ൐ႨແטႨՖ၂۱ٜࡗ၍׮֞ਸ਼ຓ၂۱ٜࡗb၂۱ ඹ۱ٜࡗ֥૙܅ս઒ೂ༯ğ function room1 () local move = io.read() if move == "south" then return room3() elseif move == "east" then return room2()
  46. Programming in Lua 38 Copyright ® 2005, Translation Team, www.luachina.net

    else print("invalid move") return room1() -- stay in the same room end end function room2 () local move = io.read() if move == "south" then return room4() elseif move == "west" then return room1() else print("invalid move") return room2() end end function room3 () local move = io.read() if move == "north" then return room1() elseif move == "east" then return room4() else print("invalid move") return room3() end end function room4 () print("congratilations!") end ໡ૌॖၛטႨ room1()ष൓ᆃ۱Ⴓ༤b ೂݔીႵᆞಒ֥ແטႨđૄՑ၍׮׻ေԷࡹ၂۱ᅜđ؟Ց၍׮ުॖି֝ᇁᅜၮԛb ֌ᆞಒ֥ແטႨॖၛ໭ཋᇅ֥ແטႨđ ၹູૄՑແטႨᆺ൞၂۱ goto ֞ਸ਼ຓ၂۱ݦඔѩ ҂൞Ԯ๤֥ݦඔטႨb
  47. Programming in Lua 40 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 7 ᅣ םսఖაٗ྘ for ᄝᆃ၂ᅣ໡ૌษંູٓྟ for ཿםսఖđ໡ૌՖ၂۱ࡥֆ֥םսఖष൓đಖު໡ૌ ࿐༝ೂޅ๙ݖ০Ⴈٓྟ for ఼֥նᆭԩཿԛ۷ི֥ۚםսఖb 7 7. .1 1 ם םս սఖ ఖა აо оЇ Ї םսఖ൞၂ᇕᆦӻᆷᆌো྘֥ࢲܒđ෱ॖၛђ৥ࠢކ֥ૄ၂۱ჭ෍bᄝ Lua ᇏ໡ૌ ӈӈ൐Ⴈݦඔট૭ඍםսఖđૄՑטႨھݦඔْࣼ߭ࠢކ֥༯၂۱ჭ෍b םսఖླေЌ਽ഈ၂ՑӮۿטႨ֥ሑ෿ބ༯၂ՑӮۿטႨ֥ሑ෿đ္ࣼ൞෰ᆩ֡ট ሱႿଧ৚ބࡼေభສଧ৚bоЇิ܂֥ࠏᇅॖၛޓಸၞൌགྷᆃ۱಩ༀb࠺ᇾğоЇ൞၂ ۱ଽ҆ݦඔđ෱ॖၛ٠໙၂۱ࠇᆀ؟۱ຓ҆ݦඔ֥ຓ҆अ҆эਈbૄՑоЇ֥ӮۿטႨ ުᆃུຓ҆अ҆эਈ׻Ќթ෰ૌ֥ᆴ čሑ෿Ď b ֒ಖೂݔေԷࡹ၂۱оЇсྶေԷࡹఃຓ ҆अ҆эਈb෮ၛ၂۱ׅ྘֥оЇ֥ࢲܒЇݣਆ۱ݦඔğ၂۱൞оЇሱ࠭Ġਸ਼၂۱൞۽ ӌčԷࡹоЇ֥ݦඔĎ b ई၂۱ࡥֆ֥২ሰđ໡ૌູ၂۱ list ཿ၂۱ࡥֆ֥םսఖđა ipairs()҂๝֥൞໡ૌ ൌགྷ֥ᆃ۱םսఖْ߭ჭ෍֥ᆴط҂൞෬ႄ༯ѓğ function list_iter (t) local i = 0 local n = table.getn(t) return function () i = i + 1 if i <= n then return t[i] end end end ᆃ۱২ሰᇏ list_iter ൞၂۱۽ӌđ ૄՑטႨ෰׻߶Էࡹ၂۱ྍ֥оЇ čםսఖЧദĎ b оЇЌթଽ҆अ҆эਈ(t,i,n)đၹՎૄՑטႨ෰ْ߭ list ᇏ֥༯၂۱ჭ෍ᆴđ֒ list ᇏી Ⴕᆴൈđْ߭ nil.໡ૌॖၛᄝ while ეओᇏ൐Ⴈᆃ۱םսఖğ t = {10, 20, 30} iter = list_iter(t) -- creates the iterator while true do local element = iter() -- calls the iterator if element == nil then break end print(element)
  48. Programming in Lua 41 Copyright ® 2005, Translation Team, www.luachina.net

    end ໡ૌഡ࠹֥ᆃ۱םսఖ္ޓಸၞႨႿٓྟ for ეओ t = {10, 20, 30} for element in list_iter(t) do print(element) end ٓྟ for ູםս࿖ߌԩ৘෮Ⴕ֥Њ࠺čbookkeepingĎ ğ൮༵טႨםս۽ӌĠଽ҆Ќ਽ םսݦඔđၹՎ໡ૌ҂ླေ iter эਈĠಖުᄝૄ၂۱ྍ֥םսԩטႨםսఖݦඔĠ֒ם սఖْ߭ nil ൈ࿖ߌࢲඏčު૫໡ૌࡼु֞ٓྟ for ି഻಩۷؟֥಩ༀĎ b ༯૫ु၂۱഍ັۚࠩ၂֥ׄ২ሰğ໡ૌཿ၂۱םսఖђ৥၂۱໓ࡱଽ֥෮Ⴕ௄஥֥ ֆՍbູਔൌགྷଢ֥đ໡ૌླေЌ਽ਆ۱ᆴğ֒భྛބᄝ֒భྛ֥ொ၍ਈđ໡ૌ൐Ⴈਆ ۱ຓ҆अ҆эਈ lineapos Ќթᆃਆ۱ᆴb function allwords() local line = io.read() -- current line local pos = 1 -- current position in the line return function () -- iterator function while line do -- repeat while there are lines local s, e = string.find(line, "%w+", pos) if s then -- found a word? pos = e + 1 -- next position is after this word return string.sub(line, s, e) -- return the word else line = io.read() -- word not found; try next line pos = 1 -- restart from first position end end return nil -- no more lines: end of traversal end end םսݦඔ֥ᇶุ҆ٳטႨਔ string.find ݦඔđstring.find ᄝ֒భྛՖ֒భ໊ᇂष൓Ұ ᅳ௄஥֥ֆՍđ২ሰᇏ௄஥֥ֆՍ൐Ⴈଆൔ'%w+'૭ඍ֥ĠೂݔҰᅳ֞၂۱ֆՍđםսݦ ඔ۷ྍ֒భ໊ᇂ pos ູֆՍުֻ֥၂۱໊ᇂđѩ౏ْ߭ᆃ۱ֆՍčstring.sub ݦඔՖ line ᇏิ౼ਆ۱໊ᇂҕඔᆭࡗ֥ሰԱĎ bڎᄵםսݦඔ؀౼ྍ֥၂ྛѩᇗྍෆ෬bೂݔીႵ line ॖ؀ْ߭ nil ࢲඏb ࣐ܵםսݦඔႵུگᄖđ֌൐Ⴈఏট൞ޓᆰܴ֥ğ for word in allwords() do
  49. Programming in Lua 42 Copyright ® 2005, Translation Team, www.luachina.net

    print(word) end ๙ӈ౦ঃ༯đםսݦඔ׻଴ཿၞႨbᆃ҂൞၂۱ն໙ีğ၂Ϯ Lua щӱ҂ླေሱ࠭ קၬםսݦඔđط൞൐Ⴈე࿽ิ܂֥,Ԣ٤ಒൌླေሱ࠭קၬb 7 7. .2 2 ٓ ٓྟ ྟ f fo or r ֥ ֥ე ეၬ ၬ భ૫໡ૌु֥֞םսఖႵ၂۱ಌׄğૄՑטႨ׻ླေԷࡹ၂۱оЇđն؟ඔ౦ঃ༯ ᆃᇕቓم׻ી൉હ໙ีđ২ೂᄝ allwords םսఖᇏԷࡹ၂۱оЇ֥սࡎбఏ؀ᆜ۱໓ࡱ টඪັ҂ቀ֡đಖطᄝႵུ౦ঃ༯ԷࡹоЇ֥սࡎ൞҂ିಧ൳֥bᄝᆃུ౦ঃ༯໡ૌॖ ၛ൐Ⴈٓྟ for ЧദটЌթםս֥ሑ෿b భ૫໡ૌु֞ᄝ࿖ߌݖӱᇏٓྟ for ᄝሱ࠭ଽ҆Ќթםսݦඔđൌ࠽ഈ෱Ќթ೘۱ ᆴ:םսݦඔđሑ෿ӈਈބ॥ᇅэਈ.༯૫བྷ༥ඪૼb ٓྟ for ֥໓مೂ༯ğ for <var-list> in <exp-list> do <body> end <var-list>൞၂۱ࠇ؟۱ၛ׹ݼٳ۩֥эਈ଀ਙіđ<exp-list>൞၂۱ࠇ؟۱ၛ׹ݼٳ ۩֥іղൔਙіđ๙ӈ౦ঃ༯ exp-list ᆺႵ၂۱ᆴğםս۽ӌ֥טႨb for k, v in pairs(t) do print(k, v) end эਈਙі k,vĠіղൔਙі pair(t)đᄝޓ؟౦ঃ༯эਈਙі္ᆺႵ၂۱эਈđбೂğ for line in io.lines() do io.write(line, '\n') end ໡ૌӫэਈਙіᇏֻ၂۱эਈູ॥ᇅэਈđఃᆴູ nil ൈ࿖ߌࢲඏb ༯૫໡ૌुुٓྟ for ֥ᆳྛݖӱğ ൮༵đԚ൓߄đ࠹ෘ in ު૫іղൔ֥ᆴđіղൔႋھْ߭ٓྟ for ླေ֥೘۱ᆴğ םսݦඔđሑ෿ӈਈބ॥ᇅэਈĠა؟ᆴڮᆴ၂ဢđೂݔіղൔْ֥߭ࢲݔ۱ඔ҂ቀ೘ ۱߶ሱ׮Ⴈ nil Ҁቀđ؟ԛ҆ٳ߶Фޭ੻b ֻؽđࡼሑ෿ӈਈބ॥ᇅэਈቔູҕඔטႨםսݦඔčᇿၩğؓႿ for ࢲܒটඪđ ሑ෿ӈਈીႵႨԩđࣇࣇᄝԚ൓߄ൈࠆ౼෰֥ᆴѩԮ־۳םսݦඔĎ b ֻ೘đࡼםսݦඔْ֥߭ᆴڮ۳эਈਙіb
  50. Programming in Lua 43 Copyright ® 2005, Translation Team, www.luachina.net

    ֻඹđೂݔֻْ֥߭၂۱ᆴູ nil ࿖ߌࢲඏđڎᄵᆳྛ࿖ߌุb ֻ໴đֻ߭֞ؽ҄ᄜՑטႨםսݦඔb ۷ࣚಒ֥টඪğ for var_1, ..., var_n in explist do block end ֩ࡎႿ do local _f, _s, _var = explist while true do local var_1, ... , var_n = _f(_s, _var) _var = var_1 if _var == nil then break end block end end ೂݔ໡ૌ֥םսݦඔ൞ fđሑ෿ӈਈ൞ sđ॥ᇅэਈ֥Ԛ൓ᆴ൞ a0đପહ॥ᇅэਈࡼ ࿖ߌğa1=f(s,a0)aa2=f(s,a1)allđᆰ֞ ai=nilb 7 7. .3 3 ໭ ໭ሑ ሑ෿ ෿֥ ֥ם םս սఖ ఖ ໭ሑ෿֥םսఖ൞ᆷ҂Ќ਽಩ޅሑ෿֥םսఖđၹՎᄝ࿖ߌᇏ໡ૌॖၛ০Ⴈ໭ሑ෿ םսఖх૧ԷࡹоЇ޽ٮحຓ֥սࡎb ૄ၂Ցםսđםսݦඔ׻൞Ⴈਆ۱эਈčሑ෿ӈਈބ॥ᇅэਈĎ֥ᆴቔູҕඔФט Ⴈđ၂۱໭ሑ෿֥םսఖᆺ০Ⴈᆃਆ۱ᆴॖၛࠆ౼༯၂۱ჭ෍bᆃᇕ໭ሑ෿םսఖ֥ׅ ྘֥ࡥֆ֥২ሰ൞ ipairsđ෰ђ৥ඔቆ֥ૄ၂۱ჭ෍b a = {"one", "two", "three"} for i, v in ipairs(a) do print(i, v) end םս֥ሑ෿ЇওФђ৥֥іč࿖ߌݖӱᇏ҂߶ڿэ֥ሑ෿ӈਈĎބ֒భ֥෬ႄ༯ѓ č॥ᇅэਈĎ đipairs ބםսݦඔ׻ޓࡥֆđ໡ૌᄝ Lua ᇏॖၛᆃဢൌགྷğ function iter (a, i) i = i + 1 local v = a[i] if v then return i, v end
  51. Programming in Lua 44 Copyright ® 2005, Translation Team, www.luachina.net

    end function ipairs (a) return iter, a, 0 end ֒ Lua טႨ ipairs(a)ष൓࿖ߌൈđ ෰ࠆ౼೘۱ᆴ:םսݦඔ iterđ ሑ෿ӈਈ a ބ॥ᇅэ ਈԚ གྷ֥ჰ൓ٚمğ ൓ᆴ 0Ġಖު Lua טႨ iter(a,0)ْ߭ 1,a[1]čԢ٤ a[1]=nilĎ ĠֻؽՑםսטႨ iter(a,1) ْ߭ 2,a[2]llᆰֻ֞၂۱٤ nil ჭ෍b Lua ९ᇏൌགྷ֥ pairs ൞၂۱Ⴈ next ൌ function pairs (t) return next, t, nil end ߎॖၛ҂൐Ⴈ ipairs ᆰࢤ൐Ⴈ next for k, v in next, t do ... end ࠺ᇾğexp-list ْ߭ࢲݔ߶Фטᆜູ೘۱đ෮ၛ Lua ࠆ౼ nextatanilĠಒ్ֹඪ֒ ෰ט 7 7. .4 4 ؟ ؟ሑ ሑ෿ ෿֥ ֥ם םս սఖ ఖ ޓ؟౦ঃ༯đםսఖླေЌթ؟۱ሑ෿ྐ༏ط҂൞ࡥֆ֥ሑ෿ӈਈބ॥ᇅэਈđቋ ࡥֆ םսఖđᆃ၂Ց໡ૌ҂൞൐ႨоЇط൞൐ႨջႵਆ۱თ (line ൞ޓࡥֆ֥đ෰сྶْ߭םսݦඔބԚ൓ሑ෿ğ Ⴈ pairs ൈࠆ౼b ֥ٚم൞൐ႨоЇđߎႵ၂ᇕٚمࣼ൞ࡼ෮Ⴕ֥ሑ෿ྐ༏ٿል֞ table ଽđࡼ table ቔູםսఖ֥ሑ෿ӈਈđ ၹູᆃᇕ౦ঃ༯ॖၛࡼ෮Ⴕ֥ྐ༏թ٢ᄝ table ଽđ ෮ၛםսݦ ඔ๙ӈ҂ླေֻؽ۱ҕඔb ༯૫໡ૌᇗཿ allwords ,pos)֥ tableb ष൓םս֥ݦඔ local iterator -- to be defined later function allwords() local state = {line = io.read(), pos = 1} return iterator, state end ᆇᆞ֥ԩ৘۽ቔ൞ᄝםսݦඔଽປӮğ
  52. Programming in Lua 45 Copyright ® 2005, Translation Team, www.luachina.net

    function iterator (state) while state.line do -- repeat while there are lines -- search for next word local s, e = string.find(state.line, "%w+", state.pos) if s then -- found a word? -- update next position (aft er this word) state.pos = e + 1 return string.sub(state.line, s, e) else -- word not found state.line = io.read() -- try next line... state.pos = 1 -- ... from first position end end return nil -- no more lines: end loop end ໡ૌႋھ࣐ॖି֥ཿ໭ሑ෿֥םսఖđၹູᆃဢ࿖ߌ֥ൈީႮ for টЌթሑ෿đ҂ ླေ 7 7. .5 5 ᆇ ᆇᆞ ᆞ֥ ֥ם םս սఖ ఖ םսఖ֥଀ሳႵ၂ུ༂֝đၹູ෱ѩીႵםսđປӮםսۿି֥൞ for ეओđ္ྸ ۷ݺ ଽ҆ປӮםս֥םսఖbᆃဢ֒໡ૌ൐Ⴈםսఖ֥ൈީࣼ҂ ླေ Էࡹؓའ޽ٮ֥սࡎཬĠೂݔ҂ିႨ໭ሑ෿֥םսఖൌགྷđႋ࣐ॖି൐ႨоЇĠ࣐ ॖି҂ေ൐Ⴈ table ᆃᇕٚൔđၹູԷࡹоЇ֥սࡎေбԷࡹ table ཬđਸ਼ຓ Lua ԩ৘о Їေбԩ৘ table ෎؇ॹུb ު૫໡ૌߎࡼु֞ਸ਼၂ᇕ൐Ⴈླྀ๝টԷࡹםսఖ֥ٚൔđ ᆃ ᇕٚൔۿି۷఼֌۷گᄖb ֥ࢡمႋھ൞'ളӮఖ'Ġ ֌൞ᄝః෰ე࿽бೂ javaa C++םսఖ֥ඪمၘࣜޓ௴ђਔđ ໡ૌ္ࡼခႨᆃᇕඌეb Ⴕ၂ᇕٚൔԷࡹ၂۱ᄝ ൐Ⴈ࿖ߌਔĠ໡ૌࣇࣇ൐Ⴈૄ၂Ցםսླေԩ৘֥಩ༀቔູҕඔטႨםսఖࠧॖđ ऎֹุඪđםսఖࢤ൳၂۱ݦඔቔູҕඔđѩ౏ᆃ۱ݦඔᄝםսఖଽ҆ФטႨb ቔູ၂۱ऎุ֥২ሰđ໡ૌ൐Ⴈഈඍٚൔᇗཿ allwords םսఖğ function allwords (f) -- repeat for each line in the file for l in io.lines() do -- repeat for each word in the line for w in string.gfind(l, "%w+") do -- call the function f(w)
  53. Programming in Lua 46 Copyright ® 2005, Translation Team, www.luachina.net

    end end end ೂݔ໡ૌམေյႆԛֆՍđᆺླေ allwords(print) ۷၂Ϯ֥ቓم൞໡ૌ൐Ⴈେ଀ݦඔቔູቔູҕඔđ ༯૫֥২ሰյႆԛֆՍ'hello'ԛགྷ ֥Ցඔğ local count = 0 allwords(function (w) if w == "hello" then count = count + 1 end en ) d print(count) Ⴈ for ࢲܒປӮ๝ဢ֥಩ༀğ local count = 0 for w in allwords() do if w == "hello" then count = count + 1 end end print(count) ᆇᆞ֥םսఖڄ֥۬ཿمᄝ Lua ঺ϱЧᇏޓੀྛđପൈߎીႵ for ࿖ߌb ৘ࢳĠ ਸ਼၂ ਆᇕڄ֥۬ཿمཌྷҵ҂նđ֌္Ⴕ౵љğ၂ٚ૫đֻؽᇕڄ۬۷ಸၞ඀ཿބ ٚ૫đfor ࢲܒ۷ਲࠃđॖၛ൐Ⴈ break ބ continue ეओĠᄝᆇᆞ֥םսఖڄ۬ཿم ᇏ return ეओᆺ൞Ֆେ଀ݦඔᇏْ߭ط҂൞๼ԛ࿖ߌb
  54. Programming in Lua 47 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 8 ᅣ щၲ·ᄎྛ·ט൫ ෙಖ໡ૌϜ Lua ֒ቔࢳ൤྘ე࿽đ֌൞ Lua ߶൮༵Ϝս઒ყщၲӮᇏࡗ઒ಖުᄜᆳ ྛ čޓ؟ࢳ൤྘ე࿽׻൞ᆃહቓ֥Ď b ᄝࢳ൤྘ე࿽ᇏթᄝщၲࢨ؍๐ఏট҂ކൡđ ಖطđ ࢳ൤྘ე࿽֥หᆘ҂ᄝႿ෰ૌ൞ڎФщၲđط൞щၲఖ൞ე࿽ᄎྛൈ֥၂҆ٳđ෮ၛđ ᆳྛщၲӁള֥ᇏࡗ઒෎؇߶۷ॹb໡ૌॖၛඪݦඔ dofile ֥թᄝࣼ൞ඪૼॖၛࡼ Lua ቔູ၂ᇕࢳ൤྘ე࿽ФטႨb భ૫໡ૌࢺകݖ dofileđϜ෱֒ቔ Lua ᄎྛս઒֥ chunk ֥၂ᇕჰ൓֥Ҡቔbdofile ൌ࠽ഈ൞၂۱ڣᇹ֥ݦඔbᆇᆞປӮۿି֥ݦඔ൞ loadfileĠა dofile ҂๝֥൞ loadfile щၲս઒Ӯᇏࡗ઒ѩ౏ْ߭щၲު֥ chunk ቔູ၂۱ݦඔđط҂ᆳྛս઒Ġਸ਼ຓ loadfile ҂߶஘ԛհ༂ྐ༏ط൞ْ߭հ༂սb.໡ૌॖၛᆃဢקၬ dofileğ function dofile (filename) local f = assert(loadfile(filename)) return f() end ೂݔ loadfile ാϧ assert ߶஘ԛհ༂b ປӮࡥֆ֥ۿି dofile бࢠٚьđ ෰؀ೆ໓ࡱщၲѩ౏ᆳྛb ಖط loadfile ۷ࡆਲࠃb ᄝؿളհ༂֥౦ঃ༯đloadfile ْ߭ nil ބհ༂ྐ༏đᆃဢ໡ૌࣼॖၛሱקၬհ༂ԩ৘b ਸ਼ຓđೂݔ໡ૌᄎྛ၂۱໓ࡱ؟Ց֥߅đloadfile ᆺླေщၲ၂Ցđ֌ॖ؟Ցᄎྛbdofile ಏૄՑ׻ေщၲb loadstring ა loadfile ཌྷරđ ᆺ҂ݖ෱҂൞Ֆ໓ࡱ৚؀ೆ chunkđ ط൞Ֆ၂۱Աᇏ؀ೆb ২ೂğ f = loadstring("i = i + 1") f ࡼ൞၂۱ݦඔđטႨൈᆳྛ i=i+1b i = 0 f(); print(i) --> 1 f(); print(i) --> 2 loadstring ݦඔۿି఼նđ֌൐Ⴈൈླ؟ࡆཬྏbಒಪીႵః෱ࡥֆ֥ࢳथ໙ี֥ٚ مᄜ൐Ⴈb Lua Ϝૄ၂۱ chunk ׻ቔູ၂۱େ଀ݦඔԩ৘b২ೂğchunk "a = 1"đloadstring ْ ߭აః֩ࡎ֥ function () a = 1 end აః෰ݦඔ၂ဢđchunks ॖၛקၬअ҆эਈ္ॖၛْ߭ᆴğ f = loadstring("local a = 10; return a + 20")
  55. Programming in Lua 48 Copyright ® 2005, Translation Team, www.luachina.net

    print(f()) --> 30 loadfile ބ loadstring ׻҂߶஘ԛհ༂đೂݔؿളհ༂෰ૌࡼْ߭ nil ࡆഈհ༂ྐ༏ğ print(loadstring("i i")) --> nil [string "i i"]:1: '=' expected near 'i' ਸ਼ຓđloadfile ބ loadstring ׻҂߶ႵшࢸིႋӁളđ෰ૌࣇࣇщၲ chunk Ӯູሱ࠭ ଽ҆ൌགྷ֥၂۱େ଀ݦඔb๙ӈؓ෰ૌ֥༂ࢳ൞෰ૌקၬਔݦඔbLua ᇏ֥ݦඔקၬ൞ ؿളᄝᄎྛൈ֥ڮᆴط҂൞ؿളᄝщၲൈbࡌೂ໡ૌႵ၂۱໓ࡱ foo.luağ -- file `foo.lua' function foo (x) print(x) end ֒໡ૌᆳྛଁ਷ f = loadfile("foo.lua")ުđfoo Фщၲਔ֌ߎીႵФקၬđೂݔေק ၬ෰сྶᄎྛ chunkğ f() -- defines `foo' foo("ok") --> ok ೂݔ୆མॹࢮ֥טႨ dostringčбೂࡆᄛѩᄎྛĎ đॖၛᆃဢ loadstring(s)() טႨ loadstring ْ֥߭ࢲݔđಖطೂݔࡆᄛ֥ଽಸթᄝეمհ༂֥߅đloadstring ْ ߭ nil ބհ༂ྐ༏ čattempt to call a nil valueĎ Ġ ູਔْ߭۷ౢԣ֥հ༂ྐ༏ॖၛ൐Ⴈ assertğ assert(loadstring(s))() ๙ӈ൐Ⴈ loadstring ࡆᄛ၂۱ሳԱી൉હၩၬđ২ೂğ f = loadstring("i = i + 1") նۀა f = function () i = i + 1 end ֩ࡎ,֌൞ֻؽ؍ս઒෎؇۷ॹၹູ෱ᆺླေщၲ ၂Ցđֻ၂؍ս઒ૄՑטႨ loadstring ׻߶ᇗྍщၲđߎႵ၂۱ᇗေ౵љğloadstring щ ၲ֥ൈީ҂ܱྏՍمٓຶğ local i = 0 f = loadstring("i = i + 1") g = function () i = i + 1 end ᆃ۱২ሰᇏđބམའ֥၂ဢ g ൐Ⴈअ҆эਈ iđಖط f ൐Ⴈಆअэਈ iĠloadstring ሹ ൞ᄝಆअߌ࣢ᇏщၲ෰֥Աb loadstring ๙ӈႨႿᄎྛӱ྽ຓ֥҆ս઒đбೂᄎྛႨ޼ሱקၬ֥ս઒bᇿၩğ loadstring ௹ຬ၂۱ chunkđࠧეओbೂݔམေࡆᄛіղൔđླေᄝіղൔభࡆ returnđ ପဢࡼْ߭іղൔ֥ᆴbु২ሰğ
  56. Programming in Lua 49 Copyright ® 2005, Translation Team, www.luachina.net

    print "enter your expression:" local l = io.read() local func = assert(loadstring("return " .. l)) print("the value of your expression is " .. func()) loadstring ْ֥߭ݦඔބ௴๙ݦඔ၂ဢđॖၛ؟ՑФטႨğ print "enter function to be plotted (with variable `x'):" local l = io.read() local f = assert(loadstring("return " .. l)) for i=1,20 do x = i -- global `x' (to be visible from the chunk) print(string.rep("*", f())) end 8 8. .1 1 r re eq qu ui ir re e ݦ ݦඔ ඔ Lua ิ܂֥ۚࠩ require ݦඔটࡆᄛᄎྛ९b ՙ੻֥ඪ require ބ dofile ປӮ๝ဢ֥ۿ ି֌Ⴕਆׄ҂๝ğ 1. require ߶ෆ෬ଢ੣ࡆᄛ໓ࡱ 2. require ߶஑؎൞ڎ໓ࡱၘࣜࡆᄛх૧ᇗگࡆᄛ๝၂໓ࡱb ႮႿഈඍหᆘđ require ᄝ Lua ᇏ൞ࡆᄛ९֥۷ݺ֥ݦඔb require ൐Ⴈ֥ਫ਼ࣥބ௴๙໡ૌु֥֞ਫ਼ࣥߎႵུ౵љđ໡ૌ၂Ϯ࡮֥֞ਫ਼ࣥ׻൞၂ ۱ଢ੣ਙіbrequire ֥ਫ਼ࣥ൞၂۱ଆൔਙіđૄ၂۱ଆൔᆷૼ၂ᇕႮྴ໓ࡱ଀črequire ֥ҕඔĎሇӮൌ໓ࡱ଀֥ٚمb۷ૼಒֹඪđૄ၂۱ଆൔ൞၂۱Їݣॖ࿊֥໙ݼ֥໓ࡱ ଀b௄஥֥ൈީ Lua ߶൮༵ࡼ໙ݼႨྴ໓ࡱ଀ูߐđಖުु൞ڎႵᆃဢ֥໓ࡱթᄝbೂ ݔ҂թᄝ࠿࿃Ⴈ๝ဢ֥ٚمႨֻؽ۱ଆൔ௄஥b২ೂđਫ਼ࣥೂ༯ğ ?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua טႨ require "lili"ൈ߶൫ሢյषᆃུ໓ࡱğ lili lili.lua c:\windows\lili /usr/local/lua/lili/lili.lua require ܱᇿ֥໙ีᆺႵٳݼčଆൔᆭࡗ֥ٳۯژĎބ໙ݼđః෰֥ྐ༏čଢ੣ٳۯ ژđ໓ࡱঔᅚ଀Ďᄝਫ਼ࣥᇏקၬb ູਔಒקਫ਼ࣥđLua ൮༵࡟Ұಆअэਈ LUA_PATH ൞ڎູ၂۱ሳژԱđೂݔ൞ᄵಪ ູᆃ۱Աࣼ൞ਫ਼ࣥĠ ڎᄵ require ࡟Ұߌ࣢эਈ LUA_PATH ֥ᆴđ ೂݔਆ۱׻ാϧ require ൐Ⴈܥק֥ਫ਼ࣥčׅ྘֥"?;?.lua"Ď
  57. Programming in Lua 50 Copyright ® 2005, Translation Team, www.luachina.net

    require ֥ਸ਼၂۱ۿି൞х૧ᇗگࡆᄛ๝၂۱໓ࡱਆՑbLua Ќ਽၂ᅦ෮Ⴕၘࣜࡆᄛ ֥໓ࡱ֥ਙіč൐Ⴈ table ЌթĎ bೂݔ၂۱ࡆᄛ֥໓ࡱᄝіᇏթᄝ require ࡥֆْ֥߭Ġ іᇏЌ਽ࡆᄛ֥໓ࡱ֥ྴ଀đط҂൞ൌ໓ࡱ଀b෮ၛೂݔ୆൐Ⴈ҂๝֥ྴ໓ࡱ଀ require ๝၂۱໓ࡱਆՑđࡼ߶ࡆᄛਆՑھ໓ࡱbбೂ require "foo"ބ require "foo.lua"đਫ਼ູࣥ "?;?.lua"ࡼ߶ࡆᄛ foo.lua ਆՑb໡ૌ္ॖၛ๙ݖಆअэਈ_LOADED ٠໙໓ࡱ଀ਙіđ ᆃဢ໡ૌࣼॖၛ஑؎໓ࡱ൞ڎФࡆᄛݖĠ ๝ဢ໡ૌ္ॖၛ൐Ⴈ၂ׄཬ࠯ెಞ require ࡆᄛ ၂۱໓ࡱਆՑbбೂđrequire "foo"ᆭު_LOADED["foo"]ࡼ҂ູ nilđ໡ૌॖၛࡼఃڮᆴ ູ nilđrequire "foo.lua"ࡼ߶ᄜՑࡆᄛھ໓ࡱb ၂۱ਫ਼ࣥᇏ֥ଆൔ္ॖၛ҂Їݣ໙ݼطᆺ൞၂۱ܥק֥ਫ਼ࣥđбೂğ ?;?.lua;/usr/local/default.lua ᆃᇕ౦ঃ༯đrequire ીႵ௄஥֥ൈީࣼ߶൐Ⴈᆃ۱ܥק֥໓ࡱč֒ಖᆃ۱ܥק֥ਫ਼ ࣥсྶ٢ᄝଆൔਙі֥ቋުҌႵၩၬĎ bᄝ require ᄎྛ၂۱ chunk ၛభđ෱קၬਔ၂۱ ಆअэਈ_REQUIREDNAME ႨটЌթФ required ֥ྴ໓ࡱ֥໓ࡱ଀b໡ૌॖၛ๙ݖ൐ Ⴈ ᆃ ۱ ࠯ ె ঔ ᅚ require ֥ ۿ ି b ई ۱ ࠞ ؊ ֥ ২ ሰ đ ໡ ૌ ॖ ၛ Ϝ ਫ਼ ࣥ ഡ ູ "/usr/local/lua/newrequire.lua"đᆃဢၛުૄՑטႨ require ׻߶ᄎྛ newrequire.luađᆃᇕ ౦ঃ༯ॖၛ๙ݖ൐Ⴈ_REQUIREDNAME ֥ᆴಀൌ࠽ࡆᄛ required ֥໓ࡱb 8 8. .2 2 C C P Pa ac ck ka ag ge es s Lua ބ C ൞ޓಸၞࢲކ֥đ൐Ⴈ C ູ Lua ཿЇbა Lua ᇏཿЇ҂๝đC Їᄝ൐Ⴈၛ భсྶ൮༵ࡆᄛѩ৵ࢤđᄝն؟ඔ༢๤ᇏቋಸၞ֥ൌགྷٚൔ൞๙ݖ׮෿৵ࢤ९ࠏᇅđಖ ط׮෿৵ࢤ९҂൞ ANSI C ֥၂҆ٳđ္ࣼ൞ඪᄝѓሙ C ᇏൌགྷ׮෿৵ࢤ൞ޓ঒଴֥b ๙ӈ Lua ҂Їݣ಩ޅ҂ିႨѓሙ C ൌགྷ֥ࠏᇅđ׮෿৵ࢤ९൞၂۱ห২b໡ૌॖၛ ࡼ׮෿৵ࢤ९ࠏᇅ൪ູః෰ࠏᇅᆭଛğ၂֊໡ૌႚႵਔ׮෿৵ࢤࠏᇅđ໡ૌࣼॖၛ׮෿ ֥ࡆᄛ Lua ᇏ҂թᄝ֥ࠏᇅb෮ၛđᄝᆃᇕห൹౦ঃ༯đLua յ௥ਔ෰௜෻࡙ಸ֥ჰᄵ ط๙ݖ่ࡱщၲ֥ٚൔູ၂ུ௜෻ൌགྷਔ׮෿৵ࢤࠏᇅb ѓሙ֥ Lua ູ windowsa Linuxa FreeBSDaSolaris ބః෰၂ུ Unix ௜෻ൌགྷਔᆃᇕࠏᇅđঔᅚః෱௜෻ᆦӻᆃᇕࠏᇅ္ ൞҂଴֥bᄝ Lua ิൕژ༯ᄎྛ print(loadlib())ुْ֥߭ࢲݔđೂݔཁൕ bad arguments ᄵඪૼ୆֥ؿ҃ϱᆦӻ׮෿৵ࢤࠏᇅđڎᄵඪૼ׮෿৵ࢤࠏᇅ҂ᆦӻࠇᆀીႵνልb Lua ᄝ၂۱ࢡ loadlib ֥ݦඔଽิ܂ਔ෮Ⴕ֥׮෿৵ࢤ֥ۿିb ᆃ۱ݦඔႵਆ۱ҕඔ: ९֥धؓਫ਼ࣥބԚ൓߄ݦඔb෮ၛׅ྘֥טႨ֥২ሰೂ༯ğ local path = "/usr/local/lua/lib/libluasocket.so" local f = loadlib(path, "luaopen_socket") loadlib ݦඔࡆᄛᆷק֥९ѩ౏৵ࢤ֞ Luađಖط෱ѩ҂յष९č္ࣼ൞ඪીႵטႨ Ԛ൓߄ݦඔĎ đّᆭ෰ْ߭Ԛ൓߄ݦඔቔູ Lua ֥၂۱ݦඔđᆃဢ໡ૌࣼॖၛᆰࢤᄝ Lua ᇏטႨ෰bೂݔࡆᄛ׮෿९ࠇᆀҰᅳԚ൓߄ݦඔൈԛհđloadlib ࡼْ߭ nil ބհ༂ྐ༏b ໡ૌॖၛྩڿభ૫၂؍ս઒đ൐ః࡟ҩհ༂ಖުטႨԚ൓߄ݦඔğ
  58. Programming in Lua 51 Copyright ® 2005, Translation Team, www.luachina.net

    local path = "/usr/local/lua/lib/libluasocket.so" -- or path = "C:\\windows\\luasocket.dll" local f = assert(loadlib(path, "luaopen_socket")) f() -- actually open the library ၂Ϯ౦ঃ༯໡ૌ௹ຬؽࣉᇅ֥ؿ҃९Їݣ၂۱აభ૫ս઒؍ཌྷර֥ stub ໓ࡱđνል ؽࣉᇅ९֥ൈީॖၛෛь٢ᄝଖ۱ଢ੣đᆺླေྩڿ stub ໓ࡱؓႋؽࣉᇅ९֥ൌ࠽ਫ਼ࣥ ࠧॖbࡼ stub ໓ࡱ෮ᄝ֥ଢ੣ࡆೆ֞ LUA_PATHđᆃဢഡקުࣼॖၛ൐Ⴈ require ݦඔ ࡆᄛ C ९ਔb 8 8. .3 3 հ հ༂ ༂ Errare humanum estčঘנထეğٕհ൞ದ֥ЧྟĎ b෮ၛ໡ૌေ࣐ॖି֥ٝᆸհ༂ ֥ؿളđLua ࣜӈቔູঔᅚე࿽ళೆᄝљ֥ႋႨᇏđ෮ၛ҂ି֒հ༂ؿളൈࡥֆ֥Щ঎ ࠇᆀ๼ԛbཌྷّđ֒հ༂ؿളൈ Lua ࢲඏ֒భ֥ chunk ѩْ߭֞ႋႨᇏb ֒ Lua მ֞҂௹ຬ֥౦ঃൈࣼ߶஘ԛհ༂đбೂğਆ۱٤ඔሳࣉྛཌྷࡆĠטႨ၂۱ ٤ݦඔ֥эਈĠ ٠໙іᇏ҂թᄝ֥ᆴ֩ čॖၛ๙ݖ metatables ྩڿᆃᇕྛູđ ު૫ࢺകĎ b ୆္ॖၛ๙ݖטႨ error ݦඔཁൕ֥஘ԛհ༂đerror ֥ҕඔ൞ေ஘ԛ֥հ༂ྐ༏b print "enter a number:" n = io.read("*number") if not n then error("invalid input") end Lua ิ܂ਔህ૊֥ଽᇂݦඔ assert টປӮഈ૫োර֥ۿିğ print "enter a number:" n = assert(io.read("*number"), "invalid input") assert ൮༵࡟Ұֻ၂۱ҕඔ൞ڎْ߭հ༂đೂݔ҂ْ߭հ༂ assert ࡥֆْ֥߭đڎᄵ assert ၛֻؽ۱ҕඔ஘ԛհ༂ྐ༏bֻؽ۱ҕඔ൞ॖ࿊֥bᇿၩ assert ൞௴๙֥ݦඔđ෰ ߶൮༵࠹ෘਆ۱ҕඔಖުᄜטႨݦඔđ෮ၛၛ༯ս઒ğ n = io.read() assert(tonumber(n), "invalid input: " .. n .. " is not a number") ࡼ߶ሹ൞ࣉྛ৵ࢤҠቔđ൐Ⴈཁൕ֥ test ॖၛх૧ᆃᇕ౦ঃb ֒ݦඔმ֞ၳӈႵਆ۱ࠎЧ֥׮ቔğْ߭հ༂ս઒ࠇᆀ஘ԛհ༂bᆃਆᇕٚൔ࿊ᄴ ଧ၂ᇕીႵܥק֥ܿᄵđ֌Ⴕ၂Ϯ֥ჰᄵğಸၞх૧֥ၳӈႋھ஘ԛհ༂ڎᄵْ߭հ༂ ս઒b ২ೂ໡ૌॉ੮ sin ݦඔđೂݔၛ၂۱ table ቔູҕඔđࡌק໡ૌْ߭հ༂ս઒đ໡ૌ ླေ࡟Ұհ༂֥ؿളđս઒ॖିೂ༯ğ local res = math.sin(x)
  59. Programming in Lua 52 Copyright ® 2005, Translation Team, www.luachina.net

    if not res then -- error ... ಖط໡ૌॖၛᄝטႨݦඔၛభޓಸၞ֥஑؎൞ڎႵၳӈğ if not tonumber(x) then -- error: x is not a number ... ಖط๙ӈ౦ঃ༯໡ૌ࠻҂൞࡟Ұҕඔ္҂൞࡟Ұْ߭ࢲݔđၹູҕඔհ༂ॖିၩ໅ ሢ໡ૌ֥ӱ྽ଖ۱ֹٚթᄝ໙ีđᆃᇕ౦ঃ༯đԩ৘ၳӈቋࡥֆቋൌ࠽֥ٚൔ൞஘ԛհ ༂ѩ౏ᇔᆸս઒֥ᄎྛb ᄜটु၂۱২ሰ io.open ݦඔႨটյष၂۱໓ࡱđ ೂݔ໓ࡱ҂թᄝࢲݔ߶ᄸહဢ଻Ĥ ޓ؟༢๤ᇏđ ๙ݖ൫ሢಀյष໓ࡱট஑؎൞ڎ໓ࡱթᄝb ෮ၛೂݔ io.open ҂ିյष໓ࡱ čႮႿ໓ࡱ҂թᄝࠇᆀીႵಃཋĎ đݦඔْ߭ nil ބհ༂ྐ༏bၛᆃᇕٚൔ໡ૌॖၛ๙ݖ აႨ޼ࢌ޺čбೂğ൞ڎေյषਸ਼၂۱໓ࡱĎކ৘֥ԩ৘໙ีğ local file, msg repeat print "enter a file name:" local name = io.read() if not name then return end -- no input file, msg = io.open(name, "r") if not file then print(msg) end until file ೂݔ୆མ๦ব҂མԩ৘ᆃུ౦ঃđႻམս઒νಆ֥ᄎྛđॖၛࡥֆ֥൐Ⴈ assertğ file = assert(io.open(name, "r")) Lua ᇏႵ၂۱༝ܸğೂݔ io.open ാϧđassert ࡼ஘ԛհ༂b file = assert(io.open("no-file", "r")) --> stdin:1: no-file: No such file or directory ᇿၩğio.open ֻْ֥߭ؽ۱ࢲݔčհ༂ྐ༏Ďቔູ assert ֻ֥ؽ۱ҕඔb 8 8. .4 4 ၳ ၳӈ ӈބ ބհ հ༂ ༂ԩ ԩ৘ ৘ ޓ؟ႋႨᇏđ҂ླေᄝ Lua ࣉྛհ༂ԩ৘đ၂ϮႵႋႨটປӮb๙ӈႋႨေ౰ Lua ᄎྛ၂؍ chunkđೂݔؿളၳӈđႋႨ۴ऌ Lua ْ֥߭հ༂ս઒ࣉྛԩ৘bᄝ॥ᇅ෻ଆ ൔ༯֥ Lua ࢳ൤ఖೂݔმ֞ၳӈđյႆԛհ༂ಖު࠿࿃ཁൕิൕژ֩ր༯၂۱ଁ਷b ೂݔᄝ Lua ᇏླေԩ৘հ༂đླေ൐Ⴈ pcall ݦඔٿል୆֥ս઒b ࡌק୆མᄎྛ၂؍ Lua ս઒đᆃ؍ս઒ᄎྛݖӱᇏॖၛѽሚ෮Ⴕ֥ၳӈބհ༂b ֻ၂҄ğࡼᆃ؍ս઒ٿልᄝ၂۱ݦඔଽ
  60. Programming in Lua 53 Copyright ® 2005, Translation Team, www.luachina.net

    function foo () ... if unexpected_condition then error() end ... print(a[i]) -- potential error: `a' may not be a table ... end ֻؽ҄ğ൐Ⴈ pcall טႨᆃ۱ݦඔ if pcall(foo) then -- no errors while running `foo' ... else -- `foo' raised an error: take appropriate actions ... end ֒ಖ္ॖၛႨେ଀ݦඔ֥ٚൔטႨ pcallğ if pcall(function () ... end) then ... else ... pcall ᄝЌ޹ଆൔ༯טႨ෰ֻ֥၂۱ҕඔѩᄎྛđၹՎॖၛѽࠆ෮Ⴕ֥ၳӈބհ༂b ೂݔીႵၳӈބհ༂đpcall ْ߭ true ބטႨْ֥߭಩ޅᆴĠڎᄵْ߭ nil ࡆհ༂ྐ༏b հ༂ྐ༏҂၂ק٤ေ൞၂۱ሳژԱč༯૫֥২ሰ൞၂۱ tableĎ đԮ־۳ error ֥಩ޅ ྐ༏׻߶Ф pcall ْ߭ğ local status, err = pcall(function () error({code=121}) end) print(err.code) --> 121 ᆃᇕࠏᇅิ܂ਔ໡ૌᄝ Lua ᇏԩ৘ၳӈބհ༂֥෮ླေ֥ಆ҆ଽಸb ໡ૌ๙ݖ error ஘ԛၳӈđಖު๙ݖ pcall ѽࠆ෰b 8 8. .5 5 հ հ༂ ༂ྐ ྐ༏ ༏ބ ބ߭ ߭۵ ۵ሶ ሶč čT Tr ra ac ce eb ba ac ck ks sĎ Ď ෙಖ୆ॖၛ൐Ⴈ಩ޅো྘֥ᆴቔູհ༂ྐ༏đ๙ӈ౦ঃ༯đ໡ૌ൐ႨሳژԱট૭ඍ მ֥֞հ༂ྐ༏bೂݔმ֞ଽ҆հ༂čбೂؓ၂۱٤ table ֥ᆴ൐Ⴈ෬ႄ༯і٠໙ĎLua ࡼሱ࠭Ӂളհ༂ྐ༏đ ڎᄵ Lua ൐ႨԮ־۳ error ݦඔ֥ҕඔቔູհ༂ྐ༏b ҂ܵᄝ൉હ ౦ঃ༯đLua ׻࣐ॖିౢԣ֥૭ඍؿള֥հ༂b local status, err = pcall(function () a = 'a'+1 end) print(err) --> stdin:1: attempt to perform arithmetic on a string value
  61. Programming in Lua 54 Copyright ® 2005, Translation Team, www.luachina.net

    local status, err = pcall(function () error("my error") end) print(err) --> stdin:1: my error ২ሰᇏհ༂ྐ༏۳ԛਔ໓ࡱ଀čstdinĎࡆഈྛݼb ݦඔ error ߎॖၛႵֻؽ۱ҕඔđ іൕհ༂֥ᄎྛࠩљb Ⴕਔᆃ۱ҕඔ୆ࣼ໭مַঠ հ༂൞љದ֥ਔđбೂđࡆೆ୆ཿਔ၂۱ݦඔႨট࡟Ұ error ൞ڎФᆞಒ֥טႨğ function foo (str) if type(str) ~= "string" then error("string expected") end ... end ॖିႵದᆃဢטႨᆃ۱ݦඔğ foo({x=1}) Lua ߶ᆷԛؿളհ༂֥൞ foo ط҂൞ errorđൌ࠽֥հ༂൞טႨ error ൈӁള֥đູਔ ࣯ᆞᆃ۱໙ีྩڿభ૫֥ս઒ಞ error Бۡհ༂ؿളᄝֻؽࠩč୆ሱ֥࠭ݦඔ൞ֻ၂ࠩĎ ೂ༯ğ function foo (str) if type(str) ~= "string" then error("string expected", 2) end ... end ֒հ༂ؿള֥ൈީđ໡ૌӈӈླေ۷؟֥հ༂ؿളཌྷܱ֥ྐ༏đط҂ֆֆ൞հ༂ؿ ള໊֥ᇂbᇀഒ௹ຬႵ၂۱ປᆜ֥ཁൕ֝ᇁհ༂ؿള֥טႨᅜ֥ tracebacksđ֒ pcall ْ ߭հ༂ྐ༏֥ൈީ෰ၘࣜ൤٢ਔЌթհ༂ؿള౦ঃ֥ᅜ֥ྐ༏bၹՎđೂݔ໡ૌམ֤֞ tracebacks ໡ૌсྶᄝ pcall ْ߭ၛభࠆ౼bLua ิ܂ਔ xpcall টൌགྷᆃ۱ۿିđxpcall ࢤ൳ਆ۱ҕඔğטႨݦඔބհ༂ԩ৘ݦඔb֒հ༂ؿളൈbLua ߶ᄝᅜ൤٢ၛభטႨհ ༂ԩ৘ݦඔđၹՎॖၛ൐Ⴈ debug ९൬ࠢհ༂ཌྷܱ֥ྐ༏bႵਆ۱ӈႨ֥ debug ԩ৘ݦ ඔğdebugbdebug ބ debug.traceback,భᆀ۳ԛ Lua ֥ิൕژđ୆ॖၛሱ࠭׮൭ҳुհ༂ ؿളൈ֥౦ঃĠުᆀ๙ݖ traceback Էࡹ۷؟֥հ༂ྐ༏,ުᆀ൞॥ᇅ෻ࢳ൤ఖႨটܒࡹ հ༂ྐ༏֥ݦඔb ୆ॖၛᄝ಩ޅൈީטႨ debug.traceback ࠆ౼֒భᄎྛ֥ traceback ྐ༏ğ print(debug.traceback())
  62. Programming in Lua 56 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 9 ᅣ ླྀ๝ӱ྽ ླྀ๝ӱ྽čcoroutineĎა؟ཌӱ౦ঃ༯֥ཌӱбࢠোරğႵሱ֥࠭ؐᅜđሱ֥࠭अ ҆эਈđႵሱ֥࠭ᆷ਷ᆷᆌđ֌൞ބః෰ླྀ๝ӱ྽܋ཚಆअэਈ֩ޓ؟ྐ༏bཌӱބླྀ ๝ӱ྽֥ᇶေ҂๝ᄝႿğᄝ؟ԩ৘ఖ౦ঃ༯đՖۀ୑ഈটࢃ؟ཌӱӱ྽๝ൈᄎྛ؟۱ཌ ӱĠطླྀ๝ӱ྽൞๙ݖླྀቔটປӮđᄝ಩၂ᆷקൈख़ᆺႵ၂۱ླྀ๝ӱ྽ᄝᄎྛđѩ౏ᆃ ۱ᆞᄝᄎྛ֥ླྀ๝ӱ྽ᆺႵᄝૼಒ֥Фေ౰ܫఏ֥ൈީҌ߶Фܫఏb ླྀ๝൞٤ӈ఼ն֥ۿିđ֌൞Ⴈఏট္ޓگᄖbೂݔ୆ֻ၂Ցᄇ؀Чᅣൈ҂৘ࢳЧ ᅣᇏ֥২ሰ౨҂ေքྏđ୆ॖၛ࠿࿃ᄇ؀Ч඀֥ః෰҆ٳಖުᄜ߭ݖ๨টᄇ؀Чᅣb 9 9. .1 1 ླྀ ླྀ๝ ๝֥ ֥ࠎ ࠎԤ Ԥ Lua ๙ݖ table ิ܂ਔ෮Ⴕ֥ླྀ๝ݦඔđcreate ݦඔԷࡹ၂۱ྍ֥ླྀ๝ӱ྽đcreate ᆺႵ၂۱ҕඔğླྀ๝ӱ྽ࡼေᄎྛ֥ս઒ٿልطӮ֥ݦඔđْ߭ᆴູ thread ো྘֥ᆴі ൕԷࡹਔ၂۱ྍ֥ླྀ๝ӱ྽b๙ӈ౦ঃ༯đcreate ֥ҕඔ൞၂۱େ଀ݦඔğ co = coroutine.create(function () print("hi") end) print(co) --> thread: 0x8071d98 ླྀ๝Ⴕ೘۱ሑ෿ğܫఏ෿aᄎྛ෿a๔ᆸ෿b֒໡ૌԷࡹ၂۱ླྀ๝ӱ྽ൈ෰ष൓֥ ሑ෿ູܫఏ෿đ္ࣼ൞ඪ໡ૌԷࡹླྀ๝ӱ྽֥ൈީ҂߶ሱ׮ᄎྛđॖၛ൐Ⴈ status ݦඔ ࡟Ұླྀ๝֥ሑ෿ğ print(coroutine.status(co)) --> suspended ݦඔ coroutine.resume ॖၛ൐ӱ྽Ⴎܫఏሑ෿эູᄎྛ෿ğ coroutine.resume(co) --> hi ᆃ۱২ሰᇏđླྀ๝ุࣇࣇյႆԛ"hi"ᆭުьࣉೆᇔᆸሑ෿ğ print(coroutine.status(co)) --> dead ֒ଢభູᆸđླྀ๝ुఏটᆺ൞၂ᇕگᄖ֥טႨݦඔ֥ٚൔđᆇᆞ఼֥նᆭԩุགྷᄝ yield ݦඔđ෱ॖၛࡼᆞᄝᄎྛ֥ս઒ܫఏđु၂۱২ሰğ co = coroutine.create(function () for i=1,10 do
  63. Programming in Lua 57 Copyright ® 2005, Translation Team, www.luachina.net

    print("co", i) coroutine.yield() end end) གྷᄝᇗྍᆳྛᆃ۱ླྀ๝ӱ྽đӱ྽ࡼᄝֻ၂۱ yield ԩФܫఏğ coroutine.resume(co) --> co 1 print(coroutine.status(co)) --> suspended Ֆླྀ๝֥ܴׄुğ ൐Ⴈݦඔ yield ॖၛ൐ӱ྽ܫఏ,֒໡ૌࠗࠃФܫఏ֥ӱ྽ൈđ yield ْ߭ѩ࠿࿃ӱ྽֥ᆳྛᆰ֞ᄜՑმ֞ yield ࠇᆀӱ྽ࢲඏb coroutine.resume(co) --> co 2 coroutine.resume(co) --> co 3 ... coroutine.resume(co) --> co 10 coroutine.resume(co) -- prints nothing ഈ૫ቋު၂ՑטႨ֥ൈީđླྀ๝ุၘࣜࢲඏđၹՎླྀ๝ӱ྽ԩႿᇔᆸሑ෿bೂݔ໡ ૌಯಖఒ๭ࠗࠃ෰đresume ࡼْ߭ false ބհ༂ྐ༏b print(coroutine.resume(co)) --> false cannot resume dead coroutine ᇿၩ:resume ᄎྛᄝЌ޹ଆൔ༯đ ၹՎೂݔླྀ๝ଽ҆թᄝհ༂ Lua ѩ҂߶஘ԛհ༂ط ൞ࡼհ༂ْ߭۳ resume ݦඔb Lua ᇏ၂ؓ resume-yield ॖၛཌྷ޺ࢌߐඔऌb ༯૫ֻ၂۱২ሰ resumeđીႵཌྷႋ֥ yieldđresume Ϝحຓ֥ҕඔԮ־۳ླྀ๝֥ᇶ ӱ྽b co = coroutine.create(function (a,b,c) print("co", a,b,c) end) coroutine.resume(co, 1, 2, 3) --> co 1 2 3 ֻؽ۱২ሰđresume ْ߭Ԣਔ true ၛຓ֥ః෰҆ٳࡼቔູҕඔԮ־۳ཌྷႋ֥ yield co = coroutine.create(function (a,b) coroutine.yield(a + b, a - b) end) print(coroutine.resume(co, 20, 10)) --> true 30 10 ؓӫྟđyield ْ֥߭حຓ֥ҕඔ္ࡼ߶Ԯ־۳ resumeb co = coroutine.create (function ()
  64. Programming in Lua 58 Copyright ® 2005, Translation Team, www.luachina.net

    print("co", coroutine.yield()) end) coroutine.resume(co) coroutine.resume(co, 4, 5) --> co 4 5 ቋު၂۱২ሰđ֒ླྀ๝ս઒ࢲඏൈᇶݦඔْ֥߭ᆴ׻߶Ԯ۳ཌྷႋ֥ resumeğ co = coroutine.create(function () return 6, 7 end) print(coroutine.resume(co)) --> true 6 7 ໡ૌޓഒᄝ๝၂۱ླྀ๝ӱ྽ᇏ൐Ⴈᆃࠫᇕหྟđ֌ૄ၂ᇕ׻ႵఃႨԩb གྷᄝၘࣜਔࢳਔ၂ུླྀ๝֥ଽಸđᄝ໡ૌ࠿࿃࿐༝ၛభđ༵ေӳౢਆ۱ۀ୑ğLua ิ܂֥ᆃᇕླྀ๝໡ૌӫູ҂ؓӫ֥ླྀ๝đࣼ൞ඪܫఏ၂۱ᆞᄝᆳྛ֥ླྀ๝֥ݦඔა൐၂ ۱Фܫఏ֥ླྀ๝ᄜՑᆳྛ֥ݦඔ൞҂๝֥đႵུე࿽ิ܂ؓӫ֥ླྀ๝đᆃᇕ౦ঃ༯đႮ ᆳྛ֞ܫఏᆭࡗሑ෿ሇߐ֥ݦඔ൞ཌྷ๝֥b Ⴕದӫ҂ؓӫ֥ླྀ๝ູ϶ླྀ๝đਸ਼၂ུದ൐Ⴈ๝ဢ֥ඌეіൕᆇᆞ֥ླྀ๝đ࿸۬ၩ ၬഈ֥ླྀ๝҂ંᄝ൉હֹٚᆺေ෱҂൞ᄝః෰֥ڣᇹս઒ଽ֥҆ൈީ׻ॖၛѩ౏ᆺି൐ ᆳྛܫఏđ ҂ં൉હൈީᄝః॥ᇅᅜଽ׻҂߶Ⴕ҂ॖथק֥טႨb čHowever, other people use the same term semi-coroutine to denote a restricted implementation of coroutines, where a coroutine can only suspend its execution when it is not inside any auxiliary function, that is, when it has no pending calls in its control stack.Ď bᆺႵ϶ླྀ๝ӱ྽֥ᇶุᇏҌॖၛ yieldđ python ᇏ֥ӁളఖčgeneratorĎࣼ൞ᆃᇕো྘֥϶ླྀ๝֥২ሰb აؓӫ֥ླྀ๝ބ҂ؓӫླྀ๝֥౵љ҂๝֥൞đླྀ๝აӁളఖ֥౵љ۷նbӁളఖཌྷ ؓбࢠࡥֆđ෰҂ିປӮᆇᆞ֥ླྀ๝෮ିປӮ֥၂ུ಩ༀb໡ૌඃ਀൐Ⴈ҂ؓӫ֥ླྀ๝ ᆭުđॖၛ০Ⴈ҂ؓӫ֥ླྀ๝ൌགྷбࢠႪᄀ֥ؓӫླྀ๝b 9 9. .2 2 ܵ ܵ֡ ֡ބ ބݖ ݖੲ ੲఖ ఖ ླྀ๝ቋႵսіྟ֥ቔႨ൞Ⴈট૭ඍളӁᆀ-ཨٮᆀ໙ีb ໡ૌࡌקႵ၂۱ݦඔᄝ҂؎ ֥ളӁᆴčбೂՖ໓ࡱᇏ؀౼Ď đਸ਼၂۱ݦඔ҂؎֥ཨٮᆃུᆴčбೂཿ֞ਸ਼၂໓ࡱᇏĎ đ ᆃਆ۱ݦඔೂ༯ğ function producer () while true do local x = io.read() -- produce new value send(x) -- send to consumer end end
  65. Programming in Lua 59 Copyright ® 2005, Translation Team, www.luachina.net

    function consumer () while true do local x = receive() -- receive from producer io.write(x, "\n") -- consume new value end end č২ሰᇏളӁᆀބཨٮᆀ׻ᄝ҂๔֥࿖ߌđྩڿ၂༯൐֤ીႵඔऌ֥ൈީ෰ૌ๔༯ টѩ҂঒଴Ď đ໙ีᄝႿೂޅ൐֤ receive ބ send ླྀ๝۽ቔbᆺ൞၂۱ׅ྘֥ජႚႵᇾ࿖ ߌ֥౦ঃđളӁᆀބཨٮᆀ׻ԩᄝࠃ׮ሑ෿đ׻Ⴕሱ֥࠭ᇶ࿖ߌđ׻ಪູਸ਼၂ٚ൞ॖט Ⴈ֥ڛༀbؓႿᆃᇕห൹֥౦ঃđॖၛڿэ၂۱ݦඔ֥ࢲܒࢳԢ࿖ߌđ൐ఃቔູФ׮֥ ࢤ൳bಖطᆃᇕڿэᄝଖུหק֥ൌ࠽౦ঃ༯ॖିѩ҂ࡥֆb ླྀ๝ູࢳथᆃᇕ໙ีิ܂ਔ৘མ֥ٚمđ ၹູטႨᆀაФטႨᆀᆭࡗ֥ resume-yield ܱ༢߶҂؎׀֚b ֒၂۱ླྀ๝טႨ yield ൈѩ҂߶ࣉೆ၂۱ྍ֥ݦඔđ ౼طսᆭ֥൞ْ߭ ၂۱ໃथ֥ resume ֥טႨbཌྷර֥đטႨ resume ൈ္҂߶ष൓၂۱ྍ֥ݦඔط൞ْ߭ yield ֥טႨbᆃᇕྟᇉᆞ൞໡ૌ෮ླေ֥đა൐֤ send-receive ླྀ๝۽ቔ֥ٚൔ൞၂ᇁ ֥.receive ߒྜളӁᆀളӁྍᆴđsend ϜӁള֥ᆴෂ۳ཨٮᆀཨٮb function receive () local status, value = coroutine.resume(producer) return value end function send (x) coroutine.yield(x) end producer = coroutine.create( function () while true do local x = io.read() -- produce new value send(x) end end) ᆃᇕഡ࠹༯đष൓ൈטႨཨٮᆀđ֒ཨٮᆀླေᆴൈ෰ߒఏളӁᆀളӁᆴđളӁᆀ ളӁᆴު๔ᆸᆰ֞ཨٮᆀᄜՑ౨౰b໡ૌӫᆃᇕഡ࠹ູཨٮᆀ౺׮֥ഡ࠹b ໡ૌॖၛ൐Ⴈݖੲఖঔᅚᆃ۱ടࠣđݖੲఖᆷᄝളӁᆀაཨٮᆀᆭࡗđॖၛؓඔऌ ࣉྛଖུሇߐԩ৘bݖੲఖᄝ๝၂ൈࡗ࠻൞ളӁᆀႻ൞ཨٮᆀđ෰౨౰ളӁᆀളӁᆴѩ ౏ሇߐ۬ൔުԮ۳ཨٮᆀđ໡ૌྩڿഈ૫֥ս઒ࡆೆݖੲఖčૄ၂ྛభ૫ࡆഈྛݼĎ bປ ᆜ֥ս઒ೂ༯ğ
  66. Programming in Lua 60 Copyright ® 2005, Translation Team, www.luachina.net

    function receive (prod) local status, value = coroutine.resume(prod) return value end function send (x) coroutine.yield(x) end function producer () return coroutine.create(function () while true do local x = io.read() -- produce new value send(x) end end) end function filter (prod) return coroutine.create(function () local line = 1 while true do local x = receive(prod) -- get new value x = string.format("%5d %s", line, x) send(x) -- send it to consumer line = line + 1 end end) end function consumer (prod) while true do local x = receive(prod) -- get new value io.write(x, "\n") -- consume new value end end ॖၛטႨğ p = producer()
  67. Programming in Lua 61 Copyright ® 2005, Translation Team, www.luachina.net

    f = filter(p) consumer(f) ࠇᆀğ consumer(filter(producer())) ुປഈ૫ᆃ۱২ሰ୆ॖିޓሱಖ֥མ֞ UNIX ֥ܵ֡đླྀ๝൞၂ᇕ٤ఽᅝൔ֥؟ཌ ӱb֥ܵ֡ٚൔ༯đૄ၂۱಩ༀᄝ׿৫֥ࣉӱᇏᄎྛđطླྀ๝ٚൔ༯đૄ۱಩ༀᄎྛᄝ ׿৫֥ླྀ๝ս઒ᇏbܵ֡ᄝ؀čconsumerĎაཿčproducerĎᆭࡗิ܂ਔ၂۱ߏԊđၹՎ ਆᆀཌྷܱ֥֥෎؇ીႵ൉હཋᇅđᄝഈ༯໓ܵ֡ᇏᆃ൞٤ӈᇗေ֥đၹູᄝࣉӱࡗ్֥ ߐսࡎ൞ޓ֥ۚbླྀ๝ଆൔ༯đ಩ༀࡗ్֥ߐսࡎࢠཬđაݦඔטႨཌྷ֒đၹՎ؀ཿॖ ၛޓݺ֥ླྀ๝ԩ৘b 9 9. .3 3 Ⴈ Ⴈቔ ቔם םս սఖ ఖ֥ ֥ླྀ ླྀ๝ ๝ ໡ૌॖၛࡼ࿖ߌ֥םսఖुቔളӁᆀ-ཨٮᆀଆൔ֥ห൹֥২ሰb םսݦඔӁളᆴ۳ ࿖ߌุཨٮb෮ၛॖၛ൐Ⴈླྀ๝টൌགྷםսఖbླྀ๝֥၂۱ܱ࡯หᆘ൞෱ॖၛ҂؎׀֚ טႨᆀაФטႨᆀᆭࡗ֥ܱ༢đᆃဢ໡ૌݸ໭ܤ੮֥൐Ⴈ෱ൌགྷ၂۱םսఖđط҂ႨЌ թםսݦඔْ֥߭ሑ෿b ໡ૌটປӮ၂۱յႆ၂۱ඔቆჭ෍֥෮Ⴕ֥ஆਙটӂૼᆃᇕႋႨbᆰࢤཿᆃဢ၂۱ םսݦඔটປӮᆃ۱಩ༀѩ҂ಸၞđ֌൞ཿ၂۱ളӮ෮Ⴕஆਙ֥־݂ݦඔѩ҂଴bනਫ਼ ൞ᆃဢ֥ğࡼඔቆᇏ֥ૄ၂۱ჭ෍٢֞ቋުđ၇Ց־݂ളӮ෮ႵഺჅჭ෍֥ஆਙbս઒ ೂ༯ğ function permgen (a, n) if n == 0 then printResult(a) else for i=1,n do -- put i-th element as the last one a[n], a[i] = a[i], a[n] -- generate all permutations of the other elements permgen(a, n - 1) -- restore i-th element a[n], a[i] = a[i], a[n] end
  68. Programming in Lua 62 Copyright ® 2005, Translation Team, www.luachina.net

    end end function printResult (a) for i,v in ipairs(a) do io.write(v, " ") end io.write("\n") end permgen ({1,2,3,4}, 4) Ⴕਔഈ૫֥ളӮఖުđ༯૫໡ૌࡼᆃ۱২ሰྩڿ၂༯൐ఃሇߐӮ၂۱םսݦඔğ 1. ֻ၂҄ printResult ڿູ yield function permgen (a, n) if n == 0 then coroutine.yield(a) else ... 2. ֻؽ҄đ໡ૌקၬ၂۱םս۽ӌđྩڿളӮఖᄝളӮఖଽԷࡹםսݦඔđѩ൐ള Ӯఖᄎྛᄝ၂۱ླྀ๝ӱ྽ଽbםսݦඔڵᄳ౨౰ླྀ๝Ӂള༯၂۱ॖି֥ஆਙb function perm (a) local n = table.getn(a) local co = coroutine.create(function () permgen(a, n) end) return function () -- iterator local code, res = coroutine.resume(co) return res end end ᆃဢ໡ૌࣼॖၛ൐Ⴈ for ࿖ߌটյႆԛ၂۱ඔቆ֥෮Ⴕஆਙ౦ঃਔğ for p in perm{"a", "b", "c"} do printResult(p) end --> b c a --> c b a --> c a b --> a c b --> b a c
  69. Programming in Lua 63 Copyright ® 2005, Translation Team, www.luachina.net

    --> a b c perm ݦඔ൐Ⴈਔ Lua ᇏӈႨ֥ଆൔğࡼ၂۱ؓླྀ๝֥ resume ֥טႨٿልᄝ၂۱ݦ ඔଽ҆đᆃᇕٚൔᄝ Lua ٤ӈӈ࡮đ෮ၛ Lua ህ૊ູՎህ૊ิ܂ਔ၂۱ݦඔ coroutine.wrapbა create ཌྷ๝֥൞đwrap Էࡹ၂۱ླྀ๝ӱ྽Ġ҂๝֥൞ wrap ҂ْ߭ླྀ ๝Чദđط൞ْ߭၂۱ݦඔđ֒ᆃ۱ݦඔФטႨൈࡼ resume ླྀ๝bwrap ᇏ resume ླྀ๝ ֥ൈީ҂߶ْ߭հ༂ս઒ቔֻູ၂۱ْ߭ࢲݔđ၂֊Ⴕհ༂ؿളđࡼ஘ԛհ༂b໡ૌॖ ၛ൐Ⴈ wrap ᇗཿ permğ function perm (a) local n = table.getn(a) return coroutine.wrap(function () permgen(a, n) end) end ၂Ϯ౦ঃ༯đcoroutine.wrap б coroutine.create ൐Ⴈఏটࡥֆᆰܴđభᆀ۷ಒ్֥ิ ܂ਔ໡ૌ෮ླေ֥ğ ၂۱ॖၛ resume ླྀ๝֥ݦඔđ ಖطಌഒਲࠃྟđ ીႵϷمᆩ֡ wrap ෮Էࡹ֥ླྀ๝֥ሑ෿đ္ીႵϷم࡟Ұհ༂֥ؿളb 9 9. .4 4 ٤ ٤ఽ ఽᅝ ᅝൔ ൔ؟ ؟ཌ ཌӱ ӱ ೂభ૫෮࡮đLua ᇏ֥ླྀ๝൞၂ླྀቔ֥؟ཌӱđૄ၂۱ླྀ๝֩๝Ⴟ၂۱ཌӱđ yield-resume ॖၛൌགྷᄝཌӱᇏ్ߐb ಖطაᆇᆞ֥؟ཌӱ҂๝֥൞đ ླྀ๝൞٤ఽᅝൔ֥b ֒၂۱ླྀ๝ᆞᄝᄎྛൈđ҂ିᄝຓ҆ᇔᆸ෰bᆺି๙ݖཁൕ֥טႨ yield ܫఏ෰֥ᆳྛb ؓႿଖུႋႨটඪᆃ۱҂թᄝ໙ีđ֌ႵུႋႨؓՎ൞҂ିಧ൳֥b҂թᄝఽᅝൔטႨ ֥ӱ྽൞ಸၞщཿ֥b҂ླေॉ੮๝҄ջট֥ bugsđၹູӱ྽ᇏ֥෮Ⴕཌӱࡗ֥๝҄׻ ൞ཁൕ֥b୆ࣇࣇླေᄝླྀ๝ս઒ӑԛਢࢸ౵ൈטႨ yield ࠧॖb ؓ٤ఽᅝൔ؟ཌӱটඪđ ҂ܵ൉હൈީᆺေႵ၂۱ཌӱטႨ၂۱ቅೖҠቔ čblocking operationĎ đᆜ۱ӱ྽ᄝቅೖҠቔປӮᆭభ׻ࡼ๔ᆸbؓն҆ٳႋႨӱ྽ط࿽đᆺ൞໭م ಧ൳֥đᆃ൐֤ޓ؟ӱ྽ჴ৖ླྀ๝طಀb༯૫໡ૌࡼु֞ᆃ۱໙ีॖၛФႵ౿֥ࢳथb ु၂۱؟ཌӱ֥২ሰğ໡ૌམ๙ݖ http ླྀၰՖჹӱᇶࠏഈ༯ᄝ၂ུ໓ࡱb໡ૌ൐Ⴈ Diego Nehab षؿ֥ LuaSocket ९টປӮb໡ૌ༵ु༯ᄝ၂۱໓ࡱ֥ൌགྷđնۀ҄ᇧ൞յ ष၂۱֞ჹӱᇶࠏ֥৵ࢤđؿෂ༯ᄛ໓ࡱ֥౨౰đष൓༯ᄛ໓ࡱđ༯ᄛປиުܱо৵ࢤb ֻ၂đࡆᄛ LuaSocket ९ require "luasocket" ֻؽđקၬჹӱᇶࠏބླေ༯ᄛ֥໓ࡱ଀ host = "www.w3.org" file = "/TR/REC-html32.html" ֻ೘đյष၂۱ TCP ৵ࢤ֞ჹӱᇶࠏ֥ 80 ؊१čhttp ڛༀ֥ѓሙ؊१Ď
  70. Programming in Lua 64 Copyright ® 2005, Translation Team, www.luachina.net

    c = assert(socket.connect(host, 80)) ഈ૫ᆃओْ߭၂۱৵ࢤؓའđ໡ૌॖၛ൐Ⴈᆃ۱৵ࢤؓའ౨౰ؿෂ໓ࡱ c:send("GET " .. file .. " HTTP/1.0\r\n\r\n") receive ݦඔْ߭෰ෂࢤ൬֥֞ඔऌࡆഈ၂۱іൕҠቔሑ෿֥ሳژԱb֒ᇶࠏ؎ष৵ ࢤൈđ໡ૌ๼ԛ࿖ߌb ֻඹđܱо৵ࢤ c:close() གྷᄝ໡ૌᆩ֡ਔೂޅ༯ᄛ၂۱໓ࡱđ༯૫໡ૌটुुೂޅ༯ᄛ؟۱໓ࡱb၂ᇕٚم ൞໡ૌᄝ၂۱ൈख़ᆺ༯ᄛ၂۱໓ࡱđᆃᇕඨ྽༯ᄛ֥ٚൔсྶ֩భ၂۱໓ࡱ༯ᄛປӮު ၂۱໓ࡱҌିष൓༯ᄛbൌ࠽ഈ൞đ֒໡ૌؿෂ၂۱౨౰ᆭުႵޓ؟ൈࡗ൞ᄝ֩րඔऌ ֥֞ղđ္ࣼ൞ඪն҆ٳൈࡗশٮᄝטႨ receive ഈbೂݔ๝ൈॖၛ༯ᄛ؟۱໓ࡱđིੱ ࡼ߶Ⴕޓնิۚb֒၂۱৵ࢤીႵඔऌ֞ղൈđॖၛՖਸ਼၂۱৵ࢤ؀౼ඔऌbޓཁಖđ ླྀ๝ູᆃᇕ๝ൈ༯ᄛิ܂ਔޓٚь֥ᆦӻđ໡ૌູૄ၂۱༯ᄛ಩ༀԷࡹ၂۱ཌӱđ֒၂ ۱ཌӱીႵඔऌ֞ղൈđ෰ࡼ॥ᇅಃࢌ۳၂۱ٳ஥ఖđႮٳ஥ఖߒఏਸ਼ຓ֥ཌӱ؀౼ඔ ऌb ൐Ⴈླྀ๝ࠏᇅᇗཿഈ૫֥ս઒đᄝ၂۱ݦඔଽğ function download (host, file) local c = assert(socket.connect(host, 80)) local count = 0 -- counts number of bytes read c:send("GET " .. file .. " HTTP/1.0\r\n\r\n") while true do local s, status = receive© count = count + string.len(s) if status == "closed" then break end end c:close() print(file, count) end ႮႿ໡ૌ҂ܱྏ໓ࡱ֥ଽಸđഈ૫֥ս઒ᆺ൞࠹ෘ໓ࡱ֥նཬط҂൞ࡼ໓ࡱଽಸൻ ԛb č֒Ⴕ؟۱ཌӱ༯ᄛ؟۱໓ࡱൈđൻԛ߶ࠁᄖᄝ၂ఏĎ đᄝྍ֥ݦඔս઒ᇏđ໡ૌ൐ Ⴈ receive Ֆჹӱ৵ࢤࢤ൬ඔऌđᄝඨ྽ࢤ൬ඔऌ֥ٚൔ༯ս઒ೂ༯ğ function receive (connection) return connection:receive(2^10) end ᄝ๝҄ࢤ൳ඔऌ֥ٚൔ༯đݦඔࢤ൬ඔऌൈ҂ିФቅೖđط൞ᄝીႵඔऌॖ౼ൈ
  71. Programming in Lua 65 Copyright ® 2005, Translation Team, www.luachina.net

    yieldđս઒ೂ༯ğ function receive (connection) connection:timeout(0) -- do not block local s, status = connection:receive(2^10) if status == "timeout" then coroutine.yield(connection) end return s, status end טႨݦඔ timeout(0)൐֤ؓ৵ࢤ֥಩ޅҠቔ׻҂߶ቅೖb֒Ҡቔْ֥߭ሑ෿ູ timeout ൈၩ໅ሢҠቔໃປӮْࣼ߭ਔbᄝᆃᇕ౦ঃ༯đཌӱ yieldb٤ false ֥ඔᆴቔູ yield ֥ҕඔۡුٳ஥ఖཌӱಯᄝᆳྛ෱֥಩ༀb čު૫໡ૌࡼु֞ٳ஥ఖླေ timeout ৵ࢤ֥౦ঃĎ đᇿၩ:ࠧ൐ᄝ timeout ଆൔ༯đ৵ࢤ၇ಖْ߭෰ࢤ൳֞ᆰ֞ timeout ູᆸđ ၹՎ receive ߶၂ᆰْ߭ s ۳ෲ֥טႨᆀb ༯૫֥ݦඔЌᆣૄ၂۱༯ᄛᄎྛᄝሱ࠭׿৫֥ཌӱଽğ threads = {} -- list of all live threads function get (host, file) -- create coroutine local co = coroutine.create(function () download(host, file) end) -- insert it in the list table.insert(threads, co) end ս઒ᇏ table ᇏູٳ஥ఖЌթਔ෮Ⴕࠃ׮֥ཌӱb ٳ஥ఖս઒൞ޓࡥֆ֥đ෱൞၂۱࿖ߌđᇯ۱טႨૄ၂۱ཌӱbѩ౏Ֆཌӱਙіᇏ ၍ԢၘࣜປӮ಩ༀ֥ཌӱb֒ીႵཌӱॖၛᄎྛൈ๼ԛ࿖ߌb function dispatcher () while true do local n = table.getn(threads) if n == 0 then break end -- no more threads to run for i=1,n do local status, res = coroutine.resume(threads[i]) if not res then -- thread finished its task? table.remove(threads, i) break end
  72. Programming in Lua 66 Copyright ® 2005, Translation Team, www.luachina.net

    end end end ቋުđᄝᇶӱ྽ᇏԷࡹླေ֥ཌӱטႨٳ஥ఖđ২ೂğՖ W3C ᅟׄഈ༯ᄛ 4 ۱໓ ࡱğ host = "www.w3c.org" get(host, "/TR/html401/html40.txt") get(host, "/TR/2002/REC-xhtml1-20020801/xhtml1.pdf") get(host, "/TR/REC-html32.html") get(host, "/TR/2000/REC-DOM-Level-2-Core-20001113/DOM2-Core.txt") dispatcher() -- main loop ൐Ⴈླྀ๝ٚൔ༯đ໡֥ࠏఖ޽ਔ 6s ༯ᄛປᆃࠫ۱໓ࡱĠඨ྽ٚൔ༯Ⴈਔ 15sđնۀ 2 П֥ൈࡗb ི࣐ܵੱิۚਔđ֌ए৖৘མ֥ൌགྷߎཌྷҵമჹđ֒ᇀഒႵ၂۱ཌӱႵඔऌॖ؀౼ ֥ൈީđᆃ؍ս઒ॖၛޓݺ֥ᄎྛbڎᄵđٳ஥ఖࡼࣉೆફ֩րሑ෿đՖ၂۱ཌӱ֞ਸ਼ ၂۱ཌӱ҂๔֥࿖ߌ஑؎൞ڎႵඔऌॖࠆ౼b ࢲݔླྀ๝ൌགྷ֥ս઒бඨ྽؀౼ࡼ޽ٮ 30 П֥ CPU ൈࡗb ູਔх૧ᆃᇕ౦ঃԛགྷđ໡ૌॖၛ൐Ⴈ LuaSocket ९ᇏ֥ select ݦඔb֒ӱ྽ᄝ၂ ቆ socket ᇏ҂؎֥࿖ߌ֩րሑ෿ڿэൈđ ෱ॖၛ൐ӱ྽Фቅೖb ໡ૌᆺླေྩڿٳ஥ఖđ ൐Ⴈ select ݦඔྩڿު֥ս઒ೂ༯ğ function dispatcher () while true do local n = table.getn(threads) if n == 0 then break end -- no more threads to run local connections = {} for i=1,n do local status, res = coroutine.resume(threads[i]) if not res then -- thread finished its task? table.remove(threads, i) break else -- timeout table.insert(connections, res) end end
  73. Programming in Lua 67 Copyright ® 2005, Translation Team, www.luachina.net

    if table.getn(connections) == n then socket.select(connections) end end end ᄝଽҪ֥࿖ߌٳ஥ఖ൬ࠢ৵ࢤіᇏtimeoutֹ৵ࢤđ ᇿၩğ receiveࡼ৵ࢤԮ־۳yieldđ ၹՎ resume ْ߭෰ૌb֒෮Ⴕ֥৵ࢤ׻ timeout ٳ஥ఖטႨ select ֩ր಩၂৵ࢤሑ෿֥ ڿэbቋᇔ֥ൌགྷིੱބഈ၂۱ླྀ๝ൌགྷ֥ٚൔཌྷ֒đਸ਼ຓđ෰҂߶ؿളફ֩րđбఏ ඨ྽ൌགྷ֥ٚൔཨݻ CPU ֥ൈࡗࣇࣇ؟၂ׄׄb
  74. Programming in Lua 68 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 10 ᅣ ປᆜൕ২ ໡ૌुਆ۱ປᆜ֥২ሰটӂૼ Lua ე࿽֥൐Ⴈbֻ၂۱২ሰটሱႿ Lua ຩᅟđ෰ᅚ ൕਔ Lua ቔູඔऌ૭ඍე࿽֥൐Ⴈbֻؽ۱২ሰࢃࢳਔઔغॖڏ৽ෘم֥ൌགྷđᆃ۱ෘ مᄝ Kernighan & Pike ᇷቔ֥ Practice of Programming ඀ᇏ္Ⴕ૭ඍb ᆃਆ۱ປᆜ֥২ሰ ᆭުđLua ე࿽ٚ૫֥ࢺകь֞Վࢲඏbު૫ࡼ࠿࿃ࢺക table ބ૫ཟؓའ֥ଽಸၛࠣѓ ሙ९aC-API ֩b 1 10 0. .1 1 L Lu ua a ቔ ቔູ ູඔ ඔऌ ऌ૭ ૭ඍ ඍე ე࿽ ࿽൐ ൐Ⴈ Ⴈ Lua ຩᅟЌ਽၂۱Їݣൗࢸ۲ֹ൐Ⴈ Lua Էࡹ֥۽ӱ֥২ሰ֥ඔऌ९bᄝඔऌ९ᇏ ໡ૌႨ၂۱ܒᄯఖၛሱ׮݂֖֥ٚൔіൕૄ၂۱۽ӱೆ१ׄđս઒ೂ༯ğ entry{ title = "Tecgraf", org = "Computer Graphics Technology Group, PUC-Rio", url = "http://www.tecgraf.puc-rio.br/", contact = "Waldemar Celes", description = [[ TeCGraf is the result of a partnership between PUC-Rio, the Pontifical Catholic University of Rio de Janeiro, and <A HREF="http://www.petrobras.com.br/">PETROBRAS</A>, the Brazilian Oil Company. TeCGraf is Lua's birthplace, and the language has been used there since 1993. Currently, more than thirty programmers in TeCGraf use Lua regularly; they have written more than two hundred thousand lines of code, distributed among dozens of final products.]] } Ⴕ౿֥൞,۽ӱೆ१֥ਙі൞թ٢ᄝ၂۱ Lua ໓ࡱᇏ֥đૄ۱۽ӱೆ१ၛ table ֥ྙ ൔቔູҕඔಀטႨ entry ݦඔb໡ૌ֥ଢ֥൞ཿ၂۱ӱ྽ࡼᆃུඔऌၛ html ۬ൔᅚൕԛ টbႮႿ۽ӱ෾؟đ໡ૌ൮༵ਙԛ۽ӱ֥ѓีđಖުཁൕૄ۱۽ӱ֥ૼ༥bࢲݔೂ༯ğ <HTML> <HEAD><TITLE>Projects using Lua</TITLE></HEAD> <BODY BGCOLOR="#FFFFFF">
  75. Programming in Lua 69 Copyright ® 2005, Translation Team, www.luachina.net

    Here are brief descriptions of some projects around the world that use <A HREF="home.html">Lua</A>. <UL> <LI><A HREF="#1">TeCGraf</A> <LI> ... </UL> <H3> <A NAME="1" HREF="http://www.tecgraf.puc-rio.br/">TeCGraf</A> <SMALL><EM>Computer Graphics Technology Group, PUC-Rio</EM></SMALL> </H3> TeCGraf is the result of a partnership between ... distributed among dozens of final products.<P> Contact: Waldemar Celes <A NAME="2"></A><HR> ... </BODY></HTML> ູਔ؀౼ඔऌđ໡ૌླေቓ֥൞ᆞಒ֥קၬݦඔ entryđಖު൐Ⴈ dofile ᆰࢤᄎྛඔ ऌ໓ࡱࠧॖčdb.luaĎ bᇿၩđ໡ૌླေђ৥ೆ१ਙіਆՑđֻ၂Ցູਔࠆ౼ѓีđֻؽ Ցູਔࠆ౼ૄ۱۽ӱ֥іඍb၂ᇕٚم൞ğ൐Ⴈཌྷ๝֥ entry ݦඔᄎྛඔऌ໓ࡱ၂Ցࡼ ෮Ⴕ֥ೆ१٢ᄝ၂۱ඔቆଽĠਸ਼၂ᇕٚمğ൐Ⴈ҂๝֥ entry ݦඔᄎྛඔऌ໓ࡱਆՑb ၹູ Lua щၲ໓ࡱ൞ޓॹ֥đᆃ৚໡ૌ࿊Ⴈֻؽᇕٚمb ൮༵đ໡ૌקၬ၂۱ڣᇹݦඔႨট۬ൔ߄໓Ч֥ൻԛčҕ࡮ 5.2 ݦඔ҆ٳଽಸĎ function fwrite (fmt, ...) return io.write(string.format(fmt, unpack(arg))) end ֻؽđ໡ૌקၬ၂۱ BEGIN ݦඔႨটཿ html ်૫֥๨҆
  76. Programming in Lua 70 Copyright ® 2005, Translation Team, www.luachina.net

    function BEGIN() io.write([[ <HTML> <HEAD><TITLE>Projects using Lua</TITLE></HEAD> <BODY BGCOLOR="#FFFFFF"> Here are brief descriptions of some projects around the world that use <A HREF="home.html">Lua</A>. ]]) end ֻ೘đקၬ entry ݦඔ a. ֻ၂۱entryݦඔđ ࡼૄ۱۽ӱ၂ਙіٚൔཿԛđ entry֥ҕඔo൞૭ඍ۽ӱ֥tableb function entry0 (o) N=N + 1 local title = o.title or '(no title)' fwrite('<LI><A HREF="#%d">%s</A>\n', N, title) end ೂݔ o.title ູ nil іૼ table ᇏ֥თ title ીႵิ܂đ໡ૌႨܥק֥"no title"ูߐb b. ֻؽ۱ entry ݦඔđཿԛ۽ӱ෮Ⴕ֥ཌྷܱྐ༏đ഍ັႵུگᄖđၹູ෮Ⴕཛ׻൞ ॖ࿊֥b function entry1 (o) N=N + 1 local title = o.title or o.org or 'org' fwrite('<HR>\n<H3>\n') local href = '' if o.url then href = string.format(' HREF="%s"', o.url) end fwrite('<A NAME="%d"%s>%s</A>\n', N, href, title) if o.title and o.org then fwrite('\n<SMALL><EM>%s</EM></SMALL>', o.org) end fwrite('\n</H3>\n') if o.description then fwrite('%s', string.gsub(o.description,
  77. Programming in Lua 71 Copyright ® 2005, Translation Team, www.luachina.net

    '\n\n\n*', '<P>\n')) fwrite('<P>\n') end if o.email then fwrite('Contact: <A HREF="mailto:%s">%s</A>\n', o.email, o.contact or o.email) elseif o.contact then fwrite('Contact: %s\n', o.contact) end end ႮႿ html ᇏ൐Ⴈචႄݼđູਔх૧Ԋ๬໡ૌᆃ৚൐ႨֆႄݼіൕԱb ֻඹđקၬ END ݦඔđཿ html ֥ແ҆ function END() fwrite('</BODY></HTML>\n') end ᄝᇶӱ྽ᇏđ໡ૌ൮༵൐Ⴈֻ၂۱ entry ᄎྛඔऌ໓ࡱൻԛ۽ӱ଀ӫ֥ਙіđಖު ᄜၛֻؽ۱ entry ᄎྛඔऌ໓ࡱൻԛ۽ӱཌྷܱྐ༏b BEGIN() N = 0 entry = entry0 fwrite('<UL>\n') dofile('db.lua') fwrite('</UL>\n') N = 0 entry = entry1 dofile('db.lua') END() 1 10 0. .2 2 ઔ ઔغ غॖ ॖڏ ڏ৽ ৽ෘ ෘم م ໡ૌֻؽ۱২ሰ൞ઔغॖڏ৽ෘم֥ൌགྷđ໡ૌ֥ӱ྽ၛభ n(n=2)۱ֆՍԱູࠎԤ ෛࠏӁള၂۱໓ЧԱb ӱ྽ֻ֥၂҆ٳ؀ԛჰ໓đѩ౏ؓીਆ۱ֆՍ֥భሗࡹ৫၂۱іđᆃ۱і۳ԛਔऎ
  78. Programming in Lua 72 Copyright ® 2005, Translation Team, www.luachina.net

    Ⴕପུభሗ֥ֆՍ֥၂۱ඨ྽b ࡹіປӮުđ ᆃ۱ӱ྽০ႨᆃᅦіളӮ၂۱ෛࠏ֥໓Чb ᄝՎ໓Чᇏđ ૄ۱ֆՍ׻۵ෛሢ෱֥֥భਆ۱ֆՍđ ᆃਆ۱ֆՍᄝ໓ЧᇏႵཌྷ๝֥ۀੱb ᆃဢđ໡ૌࣼӁളਔ၂۱٤ӈෛࠏđ֌ѩ҂ປಆෛࠏ֥໓Чb২ೂđ֒ႋႨᆃ۱ӱ྽֥ ൻԛࢲݔ߶ԛགྷoܒᄯఖ္ॖၛ๙ݖіܒᄯఖđପહ၂༯ࠫྛ֥ҬೆეؓႿᆜ۱໓ࡱট ඪđ҂൞টթԥૄ۱ۿି֥ଽಸđط൞টᅚൕ෱֥ࢲܒb pೂݔ୆མᄝؒਙ৚ᅳ֞ቋնჭ ෍ѩْ߭ቋնᆴđࢤሢཁൕิൕބᄎྛս઒b༯૫֥ֆՍ൞Ќ਽ֆՍđ҂ିႨᄝ؇ބ޶ ؇ᆭࡗሇߐb ໡ૌщཿ၂۱ݦඔႨটࡼਆ۱ֆՍᇏࡗࡆഈॢ۱৵ࢤఏটğ function prefix (w1, w2) return w1 .. ' ' .. w2 end ໡ૌႨ NOWORDčࠧ\nĎіൕ໓ࡱ֥ࢲແѩ౏Ԛ൓߄భሗֆՍđ২ೂđ༯૫֥໓ Чğ the more we try the more we do Ԛ൓߄ܒᄯ֥іູğ { ["\n \n"] = {"the"}, ["\n the"] = {"more"}, ["the more"] = {"we", "we"}, ["more we"] = {"try", "do"}, ["we try"] = {"the"}, ["try the"] = {"more"}, ["we do"] = {"\n"}, } ໡ૌ൐Ⴈಆअэਈ statetab টЌթᆃ۱іđ༯૫໡ૌປӮ၂۱ҬೆݦඔႨটᄝᆃ۱ statetab ᇏҬೆྍ֥ֆՍb function insert (index, value) if not statetab[index] then statetab[index] = {value} else table.insert(statetab[index], value) end end ᆃ۱ݦඔᇏ൮༵࡟Ұᆷק֥భሗ൞ڎթᄝđ ೂݔ҂թᄝᄵԷࡹ၂۱ྍ֥ѩڮഈྍᆴb ೂݔၘࣜթᄝᄵטႨ table.insert ࡼྍᆴҬೆ֞ਙіແ҆b ໡ૌ൐Ⴈਆ۱эਈ w1 ބ w2 টЌթቋު؀ೆ֥ਆ۱ֆՍ֥ᆴđ ؓႿૄ၂۱భሗđ ໡
  79. Programming in Lua 73 Copyright ® 2005, Translation Team, www.luachina.net

    ૌЌթࣅ۵ఃު֥ֆՍ֥ਙіb২ೂഈ૫২ሰᇏԚ൓߄ܒᄯ֥іb Ԛ൓߄іᆭުđ༯૫টुुೂޅളӮ၂۱ MAXGENč=1000Ď۱ֆՍ֥໓Чb൮༵đ ᇗྍԚ൓߄ w1 ބ w2đಖުؓႿૄ၂۱భሗđᄝః next ֆՍ֥ਙіᇏෛࠏ࿊ᄴ၂۱đյ ႆՎֆՍѩ۷ྍ w1 ބ w2đປᆜ֥ս઒ೂ༯ğ -- Markov Chain Program in Lua function allwords () local line = io.read() -- current line local pos = 1 -- current position in the line return function () -- iterator function while line do -- repeat while there are lines local s, e = string.find(line, "%w+", pos) if s then -- found a word? pos = e + 1 -- update next position return string.sub(line, s, e) -- return the word else line = io.read() -- word not found; try next line pos = 1 -- restart from first position end end return nil -- no more lines: end of traversal end end function prefix (w1, w2) return w1 .. ' ' .. w2 end local statetab function insert (index, value) if not statetab[index] then statetab[index] = {n=0} end table.insert(statetab[index], value) end local N = 2 local MAXGEN = 10000
  80. Programming in Lua 74 Copyright ® 2005, Translation Team, www.luachina.net

    local NOWORD = "\n" -- build table statetab = {} local w1, w2 = NOWORD, NOWORD for w in allwords() do insert(prefix(w1, w2), w) w1 = w2; w2 = w; end insert(prefix(w1, w2), NOWORD) -- generate text w1 = NOWORD; w2 = NOWORD -- reinitialize for i=1,MAXGEN do local list = statetab[prefix(w1, w2)] -- choose a random item from list local r = math.random(table.getn(list)) local nextword = list[r] if nextword == NOWORD then return end io.write(nextword, " ") w1 = w2; w2 = nextword end
  81. Programming in Lua 76 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 11 ᅣ ඔऌࢲܒ table ൞ Lua ᇏື၂֥ඔऌࢲܒđః෰ე࿽෮ิ܂֥ః෰ඔऌࢲܒбೂğarraysa recordsalistsaqueuesasets ֩đLua ׻൞๙ݖ table টൌགྷđѩ౏ᄝ lua ᇏ table ޓݺ֥ൌ གྷਔᆃུඔऌࢲܒb ᄝԮ๤֥ C ე࿽ࠇᆀ Pascal ე࿽ᇏ໡ૌࣜӈ൐Ⴈ arrays ބ listsčrecord+pointerĎট ൌགྷն҆ٳ֥ඔऌࢲܒđᄝ Lua ᇏ҂ࣇॖၛႨ table ປӮ๝ဢ֥ۿିđط౏ table ֥ۿି ۷ࡆ఼նb๙ݖ൐Ⴈ table ޓ؟ෘم֥ൌགྷ׻ࡥ߄ਔđбೂ୆ᄝ lua ᇏޓഒླေሱ࠭ಀൌ གྷ၂۱ෆ෬ෘمđၹູ table Чദࣼิ܂ਔᆃဢ֥ۿିb ໡ૌླေ޽၂ུൈࡗಀ࿐༝ೂޅႵི֥൐Ⴈ tableđ༯૫໡ૌ๙ݖ၂ུ২ሰটुुೂ ݔ๙ݖ table টൌགྷ၂ུӈႨ֥ඔऌࢲܒb൮༵đ໡ૌՖ arrays ބ lists ष൓đ҂ࣇၹູ෱ ൞ః෰ඔऌࢲܒ֥ࠎԤđط౏൞໡ૌ෮ඃ༑֥bᄝֻ၂҆ٳე࿽֥ࢺകᇏđ໡ૌၘࣜࢤ Ԩ֞ਔ၂ུཌྷܱ֥ଽಸđᄝᆃ၂ᅣ໡ૌࡼᄜটປᆜ֥࿐༝෰b 1 11 1. .1 1 ඔ ඔቆ ቆ ᄝ lua ᇏ๙ݖᆜඔ༯ѓ٠໙іᇏ֥ჭ෍ࠧॖࡥֆ֥ൌགྷඔቆbѩ౏ඔቆ҂с൙༵ᆷ קնཬđնཬॖၛෛླေ׮෿֥ᄹӉb ๙ӈ໡ૌԚ൓߄ඔቆ֥ൈީࣼࡗࢤ֥קၬਔඔቆ֥նཬđбೂ༯૫֥ս઒ğ a = {} -- new array for i=1, 1000 do a[i] = 0 end ๙ݖԚ൓߄đඔቆ a ֥նཬၘࣜಒקູ 1000đఒ๭٠໙ 1-1000 ၛຓ֥༯ѓؓႋ֥ ᆴࡼْ߭ nilb୆ॖၛ۴ऌླေקၬඔቆ֥༯ѓՖ 0,1 ࠇᆀ಩ၩః෰֥ඔᆴष൓đбೂğ -- creates an array with indices from -5 to 5 a = {} for i=-5, 5 do a[i] = 0 end ಖطᄝ Lua ᇏ༝ܸഈඔቆ֥༯іՖ 1 ष൓đLua ֥ѓሙ९აՎ༝ܸЌӻ၂ᇁđၹՎ ೂݔ୆֥ඔቆ༯ѓ္൞Ֆ 1 ष൓୆ࣼॖၛᆰࢤ൐Ⴈѓሙ९֥ݦඔđ ڎᄵࣼ໭مᆰࢤ൐Ⴈb ໡ૌॖၛႨܒᄯఖᄝԷࡹඔቆ֥๝ൈѩԚ൓߄ඔቆğ
  82. Programming in Lua 77 Copyright ® 2005, Translation Team, www.luachina.net

    squares = {1, 4, 9, 16, 25, 36, 49, 64, 81} ᆃဢ֥ეओᇏඔቆ֥նཬॖၛ಩ၩ֥նđമᇀࠫϤຣb 1 11 1. .2 2 ᆔ ᆔބ ބ؟ ؟ົ ົඔ ඔቆ ቆ Lua ᇏᇶေႵਆᇕіൕइᆔ֥ٚمđֻ၂ᇕ൞Ⴈඔቆ֥ඔቆіൕb္ࣼ൞ඪ၂۱і ֥ჭ෍൞ਸ਼၂۱іb২ೂđॖၛ൐Ⴈ༯૫ս઒Էࡹ၂۱ n ྛ m ਙ֥इᆔğ mt = {} -- create the matrix for i=1,N do mt[i] = {} -- create a new row for j=1,M do mt[i][j] = 0 end end ႮႿ Lua ᇏ table ൞۱ؓའđ෮ၛؓႿૄ၂ྛ໡ૌсྶཁൔ֥Էࡹ၂۱ tableđᆃु ఏটбఏ c ࠇᆀ pascal ཁ֤಺Ⴥđਸ਼၂ٚ૫෱္ิ܂ਔ۷؟֥ਲࠃྟđ২ೂॖၛྩڿభ ૫֥২ሰটԷࡹ၂۱೘࢘इᆔğ for j=1,M do ڿӮ for j=1,i do ᆃဢൌགྷ֥೘࢘इᆔбఏᆜ۱इᆔđࣇࣇ൐Ⴈ၂϶֥ଽթॢࡗb ֻؽᇏіൕइᆔ֥ٚم൞ࡼྛބਙቆކఏটđೂݔ෬ႄ༯ѓ׻൞ᆜඔđ๙ݖֻ၂۱ ෬ႄӰႿ၂۱ӈਈčਙĎᄜࡆഈֻؽ۱෬ႄđु༯૫֥২ሰൌགྷԷࡹ n ྛ m ਙ֥इᆔğ mt = {} -- create the matrix for i=1,N do for j=1,M do mt[i*M + j] = 0 end end ೂݔ෬ႄ׻൞ሳژԱ֥߅đॖၛႨ၂۱ֆሳژࡼਆ۱ሳژԱ෬ႄ৵ࢤఏটܒӮ၂۱ ֆ၂֥෬ႄ༯ѓđ২ೂ၂۱इᆔ mđ෬ႄ༯ѓູ s ބ tđࡌק s ބ t ׻҂Їݣવݼđս઒ ູğm[s..':'..t]đೂݔ s ࠇᆀ t Їݣવݼࡼ֝ᇁࠁཪđбೂ("a:", "b") ބ("a", ":b")đ֒ؓᆃ ᇕ౦ঃႵၐ໙֥ൈީॖၛ൐Ⴈ॥ᇅሳژট৵ࢤਆ۱෬ႄሳژԱđбೂ'\0'b ൌ࠽ႋႨᇏӈӈ൐Ⴈ༎ൿइᆔđ ༎ൿइᆔᆷइᆔ֥ն҆ٳჭ෍׻ູॢࠇᆀ 0 ֥इᆔb ২ೂđ໡ૌ๙ݖ๭֥ਣࢤइᆔটթԥ๭đ္ࣼ൞ඪğ֒ m,n ਆ۱ࢫׄႵ৵ࢤൈđइᆔ֥
  83. Programming in Lua 78 Copyright ® 2005, Translation Team, www.luachina.net

    m,n ᆴູؓႋ֥ xđڎᄵູ nilbೂݔ၂۱๭Ⴕ 10000 ۱ࢫׄđ௜नૄ۱ࢫׄնჿႵ 5 ่ шđູਔթԥᆃ۱๭ླေ၂۱ྛਙٳљູ 10000 ֥इᆔđሹ࠹ 10000*10000 ۱ჭ෍đൌ ࠽ഈնჿᆺႵ 50000 ۱ჭ෍٤ॢčૄྛႵ໴ਙ٤ॢđაૄ۱ࢫׄႵ໴่шؓႋĎ bޓ؟ඔ ऌࢲܒ֥඀ഈษંҐႨޅᇕٚൔҌିࢫസॢࡗđ֌൞ᄝ Lua ᇏ୆҂ླေᆃུ࠯ඌđၹູ Ⴈ table ൌགྷ֥ඔऌЧദ฿ള֥ࣼऎႵ༎ൿ֥หྟb ೂݔႨ໡ૌഈ૫ඪֻ֥၂ᇕ؟ົඔቆ টіൕđླေ 10000 ۱ tableđૄ۱ table նჿླေ໴۱ჭ෍čtableĎ ĠೂݔႨֻؽᇕіൕ ٚمটіൕđᆺླေ၂ᅦնჿ 50000 ۱ჭ෍֥іđ҂ܵႨପᇕٚൔđ୆ᆺླေթԥପུ ٤ nil ֥ჭ෍b 1 11 1. .3 3 ৽ ৽і і Lua ᇏႨ tables ޓಸၞൌགྷ৽іđૄ၂۱ࢫׄ൞၂۱ tableđᆷᆌ൞ᆃ۱і֥၂۱თđ ѩ౏ᆷཟਸ਼၂۱ࢫׄ(table)b২ೂđေൌགྷ၂۱ᆺႵਆ۱თğᆴބᆷᆌ֥ࠎЧ৽іđս ઒ೂ༯ğ ۴ࢫׄğ list = nil ᄝ৽іष๨Ҭೆ၂۱ᆴູ v ֥ࢫׄğ list = {next = list, value = v} ေђ৥ᆃ۱৽іᆺླေğ local l = list while l do print(l.value) l = l.next end ః෰ো྘֥৽іđཞචཟ৽іބ࿖ߌ৽іোර္֥൞ޓಸၞൌགྷ֥bಖުᄝ Lua ᇏ ᄝޓഒ౦ঃ༯Ҍླေᆃུඔऌࢲܒđ ၹູ๙ӈ౦ঃ༯Ⴕ۷ࡥֆ֥ٚൔটูߐ৽іb бೂđ ໡ૌॖၛႨ၂۱٤ӈն֥ඔቆটіൕᅜđఃᇏ၂۱თ n ᆷཟᅜפb 1 11 1. .4 4 ؒ ؒਙ ਙބ ބච ච؊ ؊ؒ ؒਙ ਙ ෙಖॖၛ൐Ⴈ Lua ֥ table ९ิ܂֥ insert ބ remove Ҡቔটൌགྷؒਙđ֌ᆃᇕٚൔ ൌགྷ֥ؒਙᆌؓնඔऌਈൈིੱ෾֮đႵི֥ٚൔ൞൐Ⴈਆ۱෬ႄ༯ѓđ၂۱іൕֻ၂ ۱ჭ෍đਸ਼၂۱іൕቋު၂۱ჭ෍b function ListNew () return {first = 0, last = -1}
  84. Programming in Lua 79 Copyright ® 2005, Translation Team, www.luachina.net

    end ູਔх૧໪ಙಆअଁ଀ॢࡗđ໡ૌᇗཿഈ૫֥ս઒đࡼః٢ᄝ၂۱଀ູ list ֥ table ᇏğ List = {} function List.new () return {first = 0, last = -1} end ༯૫đ໡ૌॖၛᄝӈਈൈࡗଽđປӮᄝؒਙ֥ਆ؊ࣉྛҬೆބ೷ԢҠቔਔb function List.pushleft (list, value) local first = list.first - 1 list.first = first list[first] = value end function List.pushright (list, value) local last = list.last + 1 list.last = last list[last] = value end function List.popleft (list) local first = list.first if first > list.last then error("list is empty") end local value = list[first] list[first] = nil -- to allow garbage collection list.first = first + 1 return value end function List.popright (list) local last = list.last if list.first > last then error("list is empty") end local value = list[last] list[last] = nil -- to allow garbage collection list.last = last - 1 return value end
  85. Programming in Lua 80 Copyright ® 2005, Translation Team, www.luachina.net

    ؓ࿸۬ၩၬഈ֥ؒਙটࢃđ ໡ૌᆺିטႨ pushright ބ popleftđ ᆃဢၛটđ first ބ last ֥෬ႄᆴ׻ෛᆭᄹࡆđ ྜྷᄎ֥൞໡ૌ൐Ⴈ֥൞ Lua ֥ table ൌགྷ֥đ ୆ॖၛ٠໙ඔቆ֥ჭ ෍đ๙ݖ൐Ⴈ༯ѓՖ 1 ֞ 20đ္ॖၛ 16,777,216 ֞ 16,777,236bਸ਼ຓđLua ൐Ⴈචࣚ؇ іൕඔሳđ ࡌק୆ૄ૰ᇒᆳྛ 100 ຣՑҬೆҠቔđ ᄝඔᆴၮԛၛభ୆֥ӱ྽ॖၛᄎྛ 200 ୍b 1 11 1. .5 5 ࠢ ࠢކ ކބ ބЇ Ї ࡌק୆མਙԛᄝ၂؍ჷս઒ᇏԛགྷ֥෮Ⴕѓൕژđଖᇕӱ؇ഈđ୆ླေݖੲוପུ ე࿽Чദ֥Ќ਽ሳb၂ུ C ӱ྽ჴ༟ߋႨ၂۱ሳژԱඔቆটіൕđࡼ෮Ⴕ֥Ќ਽ሳ٢ᄝ ඔቆᇏđ ؓૄ၂۱ѓൕژ֞ᆃ۱ඔቆᇏҰᅳु൞ڎູЌ਽ሳđ ႵൈީູਔิۚҰ࿘ིੱđ ؓඔቆթԥ֥ൈީ൐ႨؽٳҰᅳࠇᆀ hash ෘمb Lua ᇏіൕᆃ۱ࠢކႵ၂۱ࡥֆႵི֥ٚمđࡼ෮Ⴕࠢކᇏ֥ჭ෍ቔູ༯ѓթ٢ᄝ ၂۱ table ৚đ༯૫҂ླေҰᅳ tableđᆺླေҩ൫ुؓႿ۳ק֥ჭ෍đі֥ؓႋ༯ѓ֥ ჭ෍ᆴ൞ڎູ nilbбೂğ reserved = { ["while"] = true, ["end"] = true, ["function"] = true, ["local"] = true, } for w in allwords() do if reserved[w] then -- `w' is a reserved word ... ߎॖၛ൐Ⴈڣᇹݦඔ۷ࡆౢ༉֥ܒᄯࠢކğ function Set (list) local set = {} for _, l in ipairs(list) do set[l] = true end return set end reserved = Set{"while", "end", "function", "local", } 1 11 1. .6 6 ሳ ሳژ ژԱ Աߏ ߏԊ Ԋ ࡌק୆ေ௓ࢤޓ؟۱ཬ֥ሳژԱູ၂۱ն֥ሳژԱđбೂđՖ၂۱໓ࡱᇏᇯྛ؀ೆ ሳژԱb୆ॖିཿԛ༯૫ᆃဢ֥ս઒ğ
  86. Programming in Lua 81 Copyright ® 2005, Translation Team, www.luachina.net

    -- WARNING: bad code ahead!! local buff = "" for line in io.lines() do buff = buff .. line .. "\n" end ࣐ܵᆃ؍ս઒ुഈಀޓᆞӈđ֌ᄝ Lua ᇏ෰ི֥ੱ֮ࠞđᄝԩ৘ն໓ࡱ֥ൈީđ୆ ߶ૼཁु֞ޓતđ২ೂđླေ޽նۀ 1 ٳᇒ؀౼ 350KB ֥໓ࡱb čᆃࣼ൞ູ൉હ Lua ህ ૊ิ܂ਔ io.read(*all)࿊ཛđෲ؀౼๝ဢ֥໓ࡱᆺླေ 0.02sĎ ູ൉હᆃဢ଻ĤLua ൐Ⴈᆇᆞ֥গࠍ൬ࠢෘمđ֌෰ؿགྷӱ྽൐Ⴈ෾؟֥ଽթ෰ࣼ ߶ђ৥෰෮Ⴕ֥ඔऌࢲܒಀ൤٢গࠍඔऌđ၂Ϯ౦ঃ༯đᆃ۱ෘمႵޓݺ֥ྟିčLua ֥ॹѩ٤୽ಖ֥Ď đ֌൞ഈ૫ପ؍ս઒ loop ൐֤ෘمི֥ੱࠞః֮༯b ູਔ৘ࢳགྷའ֥Чᇉđࡌק໡ૌദᄝ loop ᇏࡗđbuff ၘࣜ൞၂۱ 50KB ֥ሳژԱđ ૄ၂ྛ֥նཬູ 20bytesđ֒ Lua ᆳྛ buff..line.."\n"ൈđ ෲԷࡹਔ၂۱ྍ֥ሳژԱնཬູ 50,020 bytesđѩ౏Ֆ buff ᇏࡼ 50KB ֥ሳژԱॊН֞ྍԱᇏb္ࣼ൞ඪđؓႿૄ၂ྛđ ׻ေ၍׮ 50KB ֥ଽթđѩ౏ᄀটᄀ؟b؀౼ 100 ྛ֥ൈީčࣇࣇ 2KBĎ đLua ၘࣜ၍׮ ਔ 5MB ֥ଽթđ൐౦ঃэᄥ֥൞༯૫֥ڮᆴეओğ buff = buff .. line .. "\n" ঺֥ሳژԱэӮਔগࠍඔऌđਆ੽࿖ߌᆭުđࡼႵਆ۱঺ԱЇݣӑݖ 100KB ֥গࠍ ඔऌbᆃ۱ൈީ Lua ߶ቓԛᆞಒ֥थקđࣉྛ෰֥গࠍ൬ࠢѩ൤٢ 100KB ֥ଽթb໙ี ᄝႿૄਆՑ࿖ߌ Lua ࣼေࣉྛ၂Ցগࠍ൬ࠢđ؀౼ᆜ۱໓ࡱླေࣉྛ 200 Ցগࠍ൬ࠢb ѩ౏෱֥ଽթ൐Ⴈ൞ᆜ۱໓ࡱնཬ֥೘Пb ᆃ۱໙ีѩ҂൞ Lua หႵ֥ğః෱֥ҐႨগࠍ൬ࠢෘم֥ѩ౏ሳژԱ҂ॖэ֥ე࿽ ္׻թᄝᆃ۱໙ีbJava ൞ቋᇷ଀֥২ሰđJava ህ૊ิ܂ StringBuffer টڿ೿ᆃᇕ౦ঃb ᄝ࠿࿃ࣉྛᆭభđ໡ૌႋھቓ۱ᇿ൤֥൞đᄝ၂Ϯ౦ঃ༯đᆃ۱໙ีѩ҂թᄝbؓ ႿཬሳژԱđഈ૫֥ପ۱࿖ߌીႵ಩ޅ໙ีbູਔ؀౼ᆜ۱໓ࡱ໡ૌॖၛ൐Ⴈ io.read(*all)đॖၛޓॹ֥ࡼᆃ۱໓ࡱ؀ೆଽթb֌൞ᄝଖུൈީđીႵࢳथ໙ี֥ࡥֆ ֥Ϸمđ෮ၛ༯૫໡ૌࡼࢺക۷ࡆི֥ۚෘمটࢳथᆃ۱໙ีb ໡ૌቋԚ֥ෘم๙ݖࡼ࿖ߌૄ၂ྛ֥ሳژԱ৵ࢤ֞঺Աഈটࢳथ໙ีđྍ֥ෘمх ૧ೂՎğ෱৵ࢤਆ۱ཬԱӮູ၂۱഍ັն֥Աđಖު৵ࢤ഍ັն֥ԱӮ۷ն֥Աb b bෘ م֥ނྏ൞ğႨ၂۱ᅜđᄝᅜָ֥҆ႨটЌթၘࣜളӮ֥ն֥ሳژԱđطཬ֥ԱՖᅜק ೆᅜbᅜ֥ሑ෿э߄ބׅ֥ࣜݱ୶ෳ໙ีোරğ໊Ⴟᅜ༯૫֥Աड़קбഈ૫֥Ӊđᆺေ ၂۱ࢠӉ֥Աೆᅜުб෱༯૫֥ԱӉđࣼࡼਆ۱ԱކѩӮ၂۱ྍ֥۷ն֥ԱđྍളӮ֥ Ա࠿࿃აཌྷਣ֥ԱбࢠೂݔӉႿָ֥҆ࡼ࠿࿃ࣉྛކѩđ࿖ߌࣉྛ֞ીႵԱॖၛކѩࠇ ᆀ֞ղᅜָb function newStack () return {""} -- starts with an empty string
  87. Programming in Lua 82 Copyright ® 2005, Translation Team, www.luachina.net

    end function addString (stack, s) table.insert(stack, s) -- push 's' into the the stack for i=table.getn(stack)-1, 1, -1 do if string.len(stack[i]) > string.len(stack[i+1]) then break end stack[i] = stack[i] .. table.remove(stack) end end ေམࠆ౼ቋᇔ֥ሳژԱđ໡ૌᆺླေՖഈཟ༯၂Ցކѩ෮Ⴕ֥ሳژԱࠧॖb table.concat ݦඔॖၛࡼ၂۱ਙі֥෮ႵԱކѩb ൐Ⴈᆃ۱ྍ֥ඔऌࢲܒđ໡ૌᇗཿ໡ૌ֥ս઒ğ local s = newStack() for line in io.lines() do addString(s, line .. "\n") end s = toString(s) ቋᇔ֥ӱ྽؀౼ 350 KB ֥໓ࡱᆺླေ 0.5sđ֒ಖטႨ io.read("*all")ಯಖ൞ቋॹ֥ ᆺླေ 0.02sb ൌ࠽ഈđ໡ૌטႨ io.read("*all")֥ൈީđio.read ࣼ൞൐Ⴈ໡ૌഈ૫֥ඔऌࢲܒđᆺ ҂ݖ൞Ⴈ C ൌགྷ֥đ ᄝ Lua ѓሙ९ᇏđ Ⴕུః෰ݦඔ္൞Ⴈ C ൌགྷ֥đ бೂ table.concatđ ൐Ⴈ table.concat ໡ૌॖၛޓಸၞ֥ࡼ၂۱ table ֥ᇏ֥ሳژԱ৵ࢤఏটđၹູ෱൐Ⴈ C ൌགྷ֥đ෮ၛࠧ൐ሳژԱޓն෱ԩ৘ఏট෎؇ߎ൞ޓॹ֥b Concat ࢤ൳ֻؽ۱ॖ࿊֥ҕඔđսіҬೆ֥ሳژԱᆭࡗ֥ٳۯژb๙ݖ൐Ⴈᆃ۱ҕ ඔđ໡ૌ҂ླေᄝૄ၂ྛᆭުҬೆ၂۱ྍྛğ local t = {} for line in io.lines() do table.insert(t, line) end s = table.concat(t, "\n") .. "\n" io.lines םսሰْ߭҂ջߐྛژ֥၂ྛđconcat ᄝሳژԱᆭࡗҬೆٳۯژđ֌൞ቋު ၂ሳژԱᆭު҂߶ҬೆٳۯژđၹՎ໡ૌླေᄝቋުࡆഈ၂۱ٳۯژbቋު၂۱৵ࢤҠ ቔگᇅਔᆜ۱ሳژԱđᆃ۱ൈީᆜ۱ሳژԱॖି൞ޓն֥b໡ૌॖၛ൐Ⴈ၂ׄཬ࠯ెđ Ҭೆ၂۱ॢԱğ
  88. Programming in Lua 84 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 12 ᅣ ඔऌ໓ࡱაӻࣲ߄ ֒໡ૌԩ৘ඔऌ໓ࡱ֥đ၂Ϯটඪđཿ໓ࡱб؀౼໓ࡱଽಸট֥ಸၞbၹູ໡ૌॖ ၛޓݺ֥॥ᇅ໓ࡱ֥ཿҠቔđطՖ໓ࡱ؀౼ඔऌӈӈஷ֞҂ॖყᆩ֥౦ঃb၂۱ࡲሐ֥ ӱ྽҂ࣇႋھॖၛ؀౼թႵᆞಒ۬ൔ֥ඔऌߎႋھିܔԩ৘ߊ໓ࡱčၲᆀᇿğؓඔऌଽ ಸބ۬ൔࣉྛ཮ဒđؓၳӈ౦ঃିܔቓԛఞ֒ԩ৘Ď bᆞၹູೂՎđൌགྷ၂۱ࡲሐ֥؀౼ ඔऌ໓ࡱ֥ӱ྽൞ޓ঒଴֥b ᆞೂ໡ૌᄝ Section 10.1čၲᆀğֻ 10 ᅣ Complete ExamplesĎᇏु֥֞২ሰđ໓ࡱ ۬ൔॖၛ๙ݖ൐Ⴈ Lua ᇏ֥ table ܒᄯఖট૭ඍb ໡ૌᆺླေᄝཿඔऌ֥഍ັቓ၂ུቓ၂ ׄحຓ֥۽ቔđ؀౼ඔऌࡼэ֤ಸၞޓ؟bٚم൞ğࡼ໡ૌ֥ඔऌ໓ࡱଽಸቔູ Lua ս ઒ཿ֞ Lua ӱ྽ᇏಀb๙ݖ൐Ⴈ table ܒᄯఖđᆃུթ٢ᄝ Lua ս઒ᇏ֥ඔऌॖၛཞః ෰௴๙֥໓ࡱ၂ဢुఏটႄದᇿଢb ູਔ۷ౢԣֹ૭ඍ໙ีđ༯૫໡ૌुु২ሰ.ೂݔ໡ૌ֥ඔऌ൞ყ༵ಒק֥۬ൔđб ೂ CSVč׹ݼٳ۩ᆴĎ đ໡ૌࠫެી֤࿊ᄴb čᄝֻ 20 ᅣđ໡ૌࢺകೂޅᄝ Lua ᇏԩ৘ CSV ໓ࡱĎ b֌൞ೂݔ໡ૌյෘԷࡹ၂۱໓ࡱູਔࡼট൐ႨđԢਔ CSVđ໡ૌॖၛ൐Ⴈ Lua ܒᄯఖট໡ૌіඍ໡ૌඔऌđᆃᇕ౦ঃ༯đ໡ૌࡼૄ၂۱ඔऌ࠺੣૭ඍູ၂۱ Lua ܒᄯఖbࡼ༯૫֥ս઒ Donald E. Knuth,Literate Programming,CSLI,1992 Jon Bentley,More Programming Pearls,Addison-Wesley,1990 ཿӮ Entry{"Donald E. Knuth", "Literate Programming", "CSLI", 1992} Entry{"Jon Bentley", "More Programming Pearls", "Addison-Wesley", 1990} ࠺ᇾ Entry{...}ა Entry({...})֩ࡎđ෰൞၂۱ၛіቔູື၂ҕඔ֥ݦඔטႨb෮ၛđ భ૫ପ؍ඔऌᄝ Lua ӱ྽ᇏіൕೂഈbೂݔေ؀౼ᆃ۱؍ඔऌđ໡ૌᆺླေᄎྛ໡ૌ֥ Lua ս઒b২ೂ༯૫ᆃ؍ս઒࠹ෘඔऌ໓ࡱᇏ࠺੣ඔğ local count = 0 function Entry (b) count = count + 1 end
  89. Programming in Lua 85 Copyright ® 2005, Translation Team, www.luachina.net

    dofile("data") print("number of entries: " .. count) ༯૫ᆃ؍ӱ྽൬ࠢ၂۱ቔᆀ଀ਙіᇏ֥଀ሳ൞ڎᄝඔऌ໓ࡱᇏԛགྷđೂݔᄝ໓ࡱᇏ ԛགྷᄵյႆԛটb čቔᆀ଀ሳ൞ Entry ֻ֥၂۱თĠ෮ၛđೂݔ b ൞၂۱ entry ֥ᆴđb[1] ᄵսіቔᆀ଀Ď local authors = {} -- a set to collect authors function Entry (b) authors[b[1]] = true end dofile("data") for name in pairs(authors) do print(name) end ᇿၩđᄝᆃུӱ྽؍ᇏ൐Ⴈ൙ࡱ౺׮֥ٚمğEntry ݦඔቔູ߭טݦඔđdofile ԩ৘ ඔऌ໓ࡱᇏ֥ૄ၂࠺੣׻߭טႨ෱b֒ඔऌ໓ࡱ֥նཬ҂൞෾ն֥౦ঃ༯đ໡ૌॖၛ൐ Ⴈ name-value ؓট૭ඍඔऌğ Entry{ author = "Donald E. Knuth", title = "Literate Programming", publisher = "CSLI", year = 1992 } Entry{ author = "Jon Bentley", title = "More Programming Pearls", publisher = "Addison-Wesley", year = 1990 } čೂݔᆃᇕ۬ൔಞ୆མఏ BibTeXđ ᆃѩ҂అܯb Lua ᇏܒᄯఖᆞ൞۴ऌটሱ BibTeX ֥ਲۋൌགྷ֥Ďᆃᇕ۬ൔ໡ૌӫᆭູሱ૭ඍඔऌ۬ൔđၹູૄ၂۱ඔऌ؍׻۴ऌ෰֥ၩ නࡥ؋֥૭ඍູ၂ᇕඔऌ۬ൔb ཌྷؓ CSV ބః෰ࣅ෪۬ൔđ ሱ૭ඍඔऌ۬ൔ۷ಸၞᄇ؀ ބ৘ࢳđ֒ླေྩڿ֥ൈީॖၛಸၞ֥൭۽щࠠđط౏҂ླေڿ׮ඔऌ໓ࡱb২ೂđೂ ݔ໡ૌམᄹࡆ၂۱თđᆺླေؓ؀౼ӱ྽഍ቔྩڿࠧॖđ֒ᆷק֥თ҂թᄝൈđ္ॖၛ ڮჍଏಪᆴb൐Ⴈ name-value ؓ૭ඍ֥౦ঃ༯đഈ૫൬ࠢቔᆀ଀֥ս઒ॖၛڿཿູğ local authors = {} -- a set to collect authors function Entry (b) authors[b.author] = true end dofile("data") for name in pairs(authors) do print(name) end གྷᄝđ࠺੣თ֥ඨ྽໭ܱࣅေਔđമᇀଖུ࠺੣ࠧ൐҂թᄝ author ᆃ۱თđ໡ૌ္ ᆺླေ഍ັڿ׮၂༯ս઒ࠧॖğ
  90. Programming in Lua 86 Copyright ® 2005, Translation Team, www.luachina.net

    function Entry (b) if b.author then authors[b.author] = true end end Lua ҂ࣇᄎྛ෎؇ॹđщၲ෎؇္ॹb২ೂđഈ૫ᆃ؍ෆࠢቔᆀ଀֥ս઒ԩ৘၂۱ 2MB ֥ඔऌ໓ࡱൈࡗ҂߶ӑݖ 1 ૰bਸ਼ຓđᆃ҂൞୽ಖ֥đඔऌ૭ඍ൞ Lua ֥ᇶေႋႨ ᆭ၂đՖ Lua ؿૼၛটđ໡ૌ޽ਔޓ؟ྏ࿓൐෰ିܔ۷ॹ֥щၲބᄎྛն֥ chunksb 1 12 2. .1 1 ྽ ྽ਙ ਙ߄ ߄ ໡ૌࣜӈླေ྽ਙ߄၂ུඔऌđູਔࡼඔऌሇߐູሳࢫੀࠇᆀሳژੀđᆃဢ໡ૌࣼ ॖၛЌթ֞໓ࡱࠇᆀ๙ݖຩ઎ؿෂԛಀb໡ૌॖၛᄝ Lua ս઒ᇏ૭ඍ྽ਙ߄֥ඔऌđᄝ ᆃᇕٚൔ༯đ໡ૌᄎྛ؀౼ӱ྽ࠧॖՖս઒ᇏܒᄯԛЌթ֥ᆴb ๙ӈđ໡ૌ൐Ⴈᆃဢ֥ٚൔ varname = <exp>টЌթ၂۱ಆअэਈ֥ᆴbvarname ҆ ٳбࢠಸၞ৘ࢳđ༯૫໡ૌটुुೂޅཿ၂۱Ӂളᆴ֥ս઒bؓႿ၂۱ඔᆴটඪğ function serialize (o) if type(o) == "number" then io.write(o) else ... end ؓႿሳژԱᆴط࿽đჰ൓֥ཿمႋھ൞: if type(o) == "string" then io.write("'", o, "'") ಖطđೂݔሳژԱЇݣห൹ሳژčбೂႄݼࠇᆀߐྛژĎ đӁള֥ս઒ࡼ҂൞Ⴕི֥ Lua ӱ྽bᆃൈީ୆ॖିႨ༯૫ٚمࢳथห൹ሳژ֥໙ีğ if type(o) == "string" then io.write("[[", o, "]]") తຣ҂ေᆃဢቓĆචႄݼ൞ᆌؓ൭ཿ֥ሳژԱ֥ط҂൞ᆌؓሱ׮Ӂള֥ሳژԱbೂ ݔႵದذၩ֥ႄ֝୆֥ӱ྽ಀ൐Ⴈ" ]]..os.execute('rm *')..[[ "ᆃဢ֥ٚൔಀЌթଖུת༆ čбೂ෱ॖିิ܂ሳژԱቔֹູᆶĎ୆ቋᇔ֥ chunk ࡼ൞ᆃ۱ဢሰğ varname = [[ ]]..os.execute('rm *')..[[ ]] ೂݔ୆ load ᆃ۱ඔऌđ ᄎྛࢲݔॖམطᆩ֥b ູਔၛνಆ֥ٚൔႄႨ಩ၩ֥ሳژԱđ string ѓሙ९ิ܂ਔ۬ൔ߄ݦඔህ૊ิ܂"%q"࿊ཛb෱ॖၛ൐ႨචႄݼіൕሳژԱѩ౏ ॖၛᆞಒ֥ԩ৘Їݣႄݼބߐྛ֩ห൹ሳژ֥ሳژԱbᆃဢ၂টđ໡ૌ֥྽ਙ߄ݦඔॖ ၛཿູğ function serialize (o)
  91. Programming in Lua 87 Copyright ® 2005, Translation Team, www.luachina.net

    if type(o) == "number" then io.write(o) elseif type(o) == "string" then io.write(string.format("%q", o)) else ... end 1 12 2. .1 1. .1 1 Ќ Ќթ թ҂ ҂ջ ջ࿖ ࿖ߌ ߌ֥ ֥ t ta ab bl le e ໡ૌ༯၂۱࡛ऍ֥಩ༀ൞Ќթіb۴ऌі֥ࢲܒ҂๝đҐ౼֥ٚم္Ⴕޓ؟bીႵ ၂ᇕֆ၂֥ෘمؓ෮Ⴕ౦ঃ׻ିޓݺֹࢳथ໙ีbࡥֆ֥і҂ࣇླေࡥֆ֥ෘمط౏ࢲ ݔ໓ࡱ္ླေुఏট္۷ૅܴb ໡ૌֻ၂ՑӇ൫ೂ༯ğ function serialize (o) if type(o) == "number" then io.write(o) elseif type(o) == "string" then io.write(string.format("%q", o)) elseif type(o) == "table" then io.write("{\n") for k,v in pairs(o) do io.write(" ", k, " = ") serialize(v) io.write(",\n") end io.write("}\n") else error("cannot serialize a " .. type(o)) end end ࣐ܵ෰ޓࡥֆđ֌෰֥ಒޓݺ֥ࢳथਔ໙ีbᆺေіࢲܒ൞၂۱ඎ྘ࢲܒč္ࣼ൞ ඪđીႵ܋ཚ֥ሰіѩ౏ીႵ࿖ߌĎ đ෰മᇀॖၛԩ৘ళสіčіᇏіĎ bؓႿ෮ࣉ҂ᆜ ఊ֥і໡ૌॖၛഒቔڿࣉ൐ࢲݔ۷ૅܴđᆃॖၛቔູ၂۱਀༝Ӈ൫၂༯b čิൕğᄹࡆ၂ ۱ҕඔіൕ෪ࣉ֥ሳژԱđ টࣉྛ྽ਙ߄Ď b భ૫֥ݦඔࡌקіᇏԛགྷ֥෮Ⴕܱ࡯ሳ׻൞ ކم֥ѓൕژbೂݔіᇏႵ҂ژކ Lua ეم֥ඔሳܱ࡯ሳࠇᆀሳژԱܱ࡯ሳđഈ૫֥ս ઒ࡼஷ֞ઐِb၂۱ࡥֆ֥ࢳथᆃ۱଴ี֥ٚم൞ࡼğ io.write(" ", k, " = ")
  92. Programming in Lua 88 Copyright ® 2005, Translation Team, www.luachina.net

    ڿູ io.write(" [") serialize(k) io.write(") = ") ᆃဢ၂টđ໡ૌڿ೿ਔ໡ૌ֥ݦඔ֥ࡲሐྟđбࢠ၂༯ਆՑ֥ࢲݔğ -- result of serialize{a=12, b='Lua', key='another "one"'} -- ֻ၂۱ϱЧ { a = 12, b = "Lua", key = "another \"one\"", } -- ֻؽ۱ϱЧ { ["a"] = 12, ["b"] = "Lua", ["key"] = "another \"one\"", } ໡ૌॖၛ๙ݖҩ൫ૄ၂ᇕ౦ঃđु൞ڎླေٚওݼđਸ਼ຓđ໡ૌࡼᆃ۱໙ี਽ቔ၂ ۱਀༝۳նࡅb 1 12 2. .1 1. .2 2 Ќ Ќթ թջ ջႵ Ⴕ࿖ ࿖ߌ ߌ֥ ֥ t ta ab bl le e ᆌؓ௴๙ຉ௪ۀ୑ഈ֥ջႵ࿖ߌіބ܋ཚሰі֥ tableđ໡ૌླေਸ਼ຓ၂ᇕ҂๝֥ٚ مটԩ৘bܒᄯఖ҂ିޓݺֹࢳथᆃᇕ౦ঃđ໡ૌ҂൐Ⴈbູਔіൕ࿖ߌ໡ૌླေࡼі ଀࠺੣༯টđ༯૫໡ૌ֥ݦඔႵਆ۱ҕඔğtable ބؓႋ֥଀ሳbਸ਼ຓđ໡ૌߎсྶ࠺੣ ၘࣜЌթݖ֥ table ၛٝᆸႮႿ࿖ߌطФᇗگЌթb໡ૌ൐Ⴈ၂۱حຓ֥ table ট࠺੣Ќ թݖ֥і֥݅ࠖđᆃ۱і֥༯і෬ႄູ tableđطᆴູؓႋ֥і଀b ໡ૌቓ၂۱ཋᇅğ ေЌթ֥ table ᆺႵ၂۱ሳژԱࠇᆀඔሳܱ࡯ሳb ༯૫֥ᆃ۱ݦඔ ྽ਙ߄ࠎЧো྘ѩْ߭ࢲݔb function basicSerialize (o) if type(o) == "number" then return tostring(o) else -- assume it is a string return string.format("%q", o) end
  93. Programming in Lua 89 Copyright ® 2005, Translation Team, www.luachina.net

    end ܱ࡯ଽಸᄝࢤ༯ট֥ᆃ۱ݦඔđsaved ᆃ۱ҕඔ൞ഈ૫ิ֥֞࠺੣ၘࣜЌթ֥і֥ ሶ֥ࠖ tableb function save (name, value, saved) saved = saved or {} -- initial value io.write(name, " = ") if type(value) == "number" or type(value) == "string" then io.write(basicSerialize(value), "\n") elseif type(value) == "table" then if saved[value] then -- value already saved? -- use its previous name io.write(saved[value], "\n") else saved[value] = name -- save name for next time io.write("{}\n") -- create a new table for k,v in pairs(value) do -- save its fields local fieldname = string.format("%s[%s]", name, basicSerialize(k)) save(fieldname, v, saved) end end else error("cannot save a " .. type(value)) end end ई۱২ሰğ ໡ૌࡼေЌթ֥ table ູğ a = {x=1, y=2; {3,4,5}} a[2] = a -- cycle a.z = a[1] -- shared sub-table טႨ save('a', a)ᆭުࢲݔູğ a = {} a[1] = {} a[1][1] = 3 a[1][2] = 4 a[1][3] = 5
  94. Programming in Lua 90 Copyright ® 2005, Translation Team, www.luachina.net

    a[2] = a a["y"] = 2 a["x"] = 1 a["z"] = a[1] čൌ࠽֥ඨ྽ॖିႵ෮э߄đ෱၇ঠႿ table ђ৥֥ඨ྽đ҂ݖđᆃ۱ෘمЌᆣਔ၂ ۱ྍ֥קၬᇏླေ֥భ૫֥ࢫׄ׻ၘࣜФקၬݖĎ ೂݔ໡ૌམЌթջႵ܋ཚ҆ٳ֥іđ ໡ૌॖၛ൐Ⴈ๝ဢ table ֥ saved ҕඔטႨ save ݦඔđ২ೂ໡ૌԷࡹ༯૫ਆ۱іğ a = {{"one", "two"}, 3} b = {k = a[1]} Ќթ෱ૌğ save('a', a) save('b', b) ࢲݔࡼٳљЇݣཌྷ๝҆ٳğ a = {} a[1] = {} a[1][1] = "one" a[1][2] = "two" a[2] = 3 b = {} b["k"] = {} b["k"][1] = "one" b["k"][2] = "two" ಖطೂݔ໡ૌ൐Ⴈ๝၂۱ saved іটטႨ save ݦඔğ local t = {} save('a', a, t) save('b', b, t) ࢲݔࡼ܋ཚཌྷ๝҆ٳğ a = {} a[1] = {} a[1][1] = "one" a[1][2] = "two" a[2] = 3 b = {} b["k"] = a[1]
  95. Programming in Lua 91 Copyright ® 2005, Translation Team, www.luachina.net

    ഈ૫ᆃᇕٚم൞ Lua ᇏӈႨ֥ٚمđ֒ಖ္Ⴕః෰၂ུٚمॖၛࢳथ໙ีbбೂđ ໡ૌॖၛ҂൐Ⴈಆअэਈ଀টЌթčchunk ܒᄯ၂۱ local ᆴಖުْ߭෰Ď Ġ๙ݖܒᄯ၂ ᅦіđૄᅦі଀აఃؓႋ֥ݦඔؓႋఏট֩bLua ۳Ⴭ୆ಃ৯đႮ୆थקೂޅൌགྷb
  96. Programming in Lua 92 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 13 ᅣ Metatables and Metamethods Lua ᇏ֥ table ႮႿקၬ֥ྛູđ໡ૌॖၛؓ key-value ؓᆳྛࡆҠቔđ٠໙ key ؓ ႋ֥ valueđђ৥෮Ⴕ֥ key-valueb֌൞໡ૌ҂ॖၛؓਆ۱ table ᆳྛࡆҠቔđ္҂ॖၛ бࢠਆ۱і֥նཬb Metatables ᄍྸ໡ૌڿэ table ֥ྛູđ২ೂđ൐Ⴈ Metatables ໡ૌॖၛקၬ Lua ೂ ޅ࠹ෘਆ۱ table ֥ཌྷࡆҠቔ a+bb֒ Lua ൫๭ؓਆ۱іࣉྛཌྷࡆൈđ෰߶࡟Ұਆ۱і൞ ڎႵ၂۱іႵ Metatableđ ѩ౏࡟Ұ Metatable ൞ڎႵ__add თb ೂݔᅳ֞ᄵטႨᆃ۱__add ݦඔč෮໌֥ MetamethodĎಀ࠹ෘࢲݔb Lua ᇏ֥ૄ၂۱і׻Ⴕః Metatableb čު૫໡ૌࡼु֞ userdata ္Ⴕ MetatableĎ đ Lua ଏಪԷࡹ၂۱҂ջ metatable ֥ྍі t = {} print(getmetatable(t)) --> nil ॖၛ൐Ⴈ setmetatable ݦඔഡᇂࠇᆀڿэ၂۱і֥ metatable t1 = {} setmetatable(t, t1) assert(getmetatable(t) == t1) ಩ޅ၂۱і׻ॖၛ൞ః෰၂۱і֥ metatableđ ၂ቆཌྷܱ֥іॖၛ܋ཚ၂۱ metatable č૭ඍ෰ૌ܋๝֥ྛູĎ b၂۱і္ॖၛ൞ሱദ֥ metatableč૭ඍః඲ႵྛູĎ b 1 13 3. .1 1 ෘ ෘඌ ඌᄎ ᄎෘ ෘ֥ ֥ M Me et ta am me et th ho od ds s ᆃ၂҆ٳ໡ૌ๙ݖ၂۱ࡥֆ֥২ሰࢺകೂޅ൐Ⴈ metamethodsbࡌק໡ૌ൐Ⴈ table ট૭ඍࢲކđ൐Ⴈݦඔট૭ඍࠢކ֥ѩҠቔđࢌࠢҠቔđlike Ҡቔb໡ૌᄝ၂۱іଽק ၬᆃུݦඔđಖު൐ႨܒᄯݦඔԷࡹ၂۱ࠢކğ Set = {} function Set.new (t) local set = {} for _, l in ipairs(t) do set[l] = true end return set
  97. Programming in Lua 93 Copyright ® 2005, Translation Team, www.luachina.net

    end function Set.union (a,b) local res = Set.new{} for k in pairs(a) do res[k] = true end for k in pairs(b) do res[k] = true end return res end function Set.intersection (a,b) local res = Set.new{} for k in pairs(a) do res[k] = b[k] end return res end ູਔϺᇹ৘ࢳӱ྽ᄎྛࢲݔđ໡ૌ္קၬਔյႆݦඔൻԛࢲݔğ function Set.tostring (set) local s = "{" local sep = "" for e in pairs(set) do s = s .. sep .. e sep = ", " end return s .. "}" end function Set.print (s) print(Set.tostring(s)) end གྷᄝ໡ૌམࡆݼᄎෘژ(+)ᆳྛਆ۱ࠢކ֥ѩҠቔđ໡ૌࡼ෮Ⴕࠢކ܋ཚ၂۱ metatableđѩ౏ູᆃ۱ metatable เࡆೂޅԩ৘ཌྷࡆҠቔb ֻ၂҄đ໡ૌקၬ၂۱௴๙֥іđႨটቔູ metatablebູх૧໪ಙଁ଀ॢࡗđ໡ૌ ࡼః٢ᄝ set ଽ҆b Set.mt = {} -- metatable for sets ֻؽ҄đྩڿ set.new ݦඔđᄹࡆ၂ྛđԷࡹі֥ൈީ๝ൈᆷקؓႋ֥ metatableb function Set.new (t) -- 2nd version
  98. Programming in Lua 94 Copyright ® 2005, Translation Team, www.luachina.net

    local set = {} setmetatable(set, Set.mt) for _, l in ipairs(t) do set[l] = true end return set end ᆃဢ၂টđset.new Էࡹ֥෮Ⴕ֥ࠢކ׻Ⴕཌྷ๝֥ metatable ਔğ s1 = Set.new{10, 20, 30, 50} s2 = Set.new{30, 1} print(getmetatable(s1)) --> table: 00672B60 print(getmetatable(s2)) --> table: 00672B60 ֻ೘҄đ۳ metatable ᄹࡆ__add ݦඔb Set.mt.__add = Set.union ֒ Lua ൫๭ؓਆ۱ࠢކཌྷࡆൈđࡼטႨᆃ۱ݦඔđၛਆ۱ཌྷࡆ֥іቔູҕඔb ๙ݖ metamethodđ໡ૌॖၛؓਆ۱ࠢކࣉྛཌྷࡆğ s3 = s1 + s2 Set.print(s3) --> {1, 10, 20, 30, 50} ๝ဢ֥໡ૌॖၛ൐ႨཌྷӰᄎෘژটקၬࠢކ֥ࢌࠢҠቔ Set.mt.__mul = Set.intersection Set.print((s1 + s2)*s1) --> {10, 20, 30, 50} ؓႿૄ၂۱ෘඌᄎෘژđmetatable ׻Ⴕؓႋ֥თ଀აఃؓႋđԢਔ__add,__mul ຓđ ߎႵ__sub(ࡨ),__div(Ԣ),__unm(ڵ),__pow(ૢ)đ໡ૌ္ॖၛקၬ__concat קၬ৵ࢤྛູb ֒໡ૌؓਆ۱іࣉྛࡆીႵ໙ีđ֌ೂݔਆ۱ҠቔඔႵ҂๝֥ metatable ২ೂğ s = Set.new{1,2,3} s = s + 8 Lua ࿊ᄴ metamethod ֥ჰᄵğೂݔֻ၂۱ҕඔթᄝջႵ__add თ֥ metatableđLua ൐Ⴈ෱ቔູ metamethodđބֻؽ۱ҕඔ໭ܱĠ ڎᄵֻؽ۱ҕඔթᄝջႵ__add თ֥ metatableđ Lua ൐Ⴈ෱ቔູ metamethod ڎᄵБ հb Lua ҂ܱྏᆃᇕࠁކো྘֥đೂݔ໡ૌᄎྛഈ૫֥ s=s+8 ֥২ሰᄝ Set.union ؿളհ ༂ğ bad argument #1 to `pairs' (table expected, got number) ೂݔ໡ૌམ֤֞۷ࡆౢԣֹհ༂ྐ༏đ໡ૌླေሱ࠭ཁൔ֥࡟ҰҠቔඔ֥ো྘ğ
  99. Programming in Lua 95 Copyright ® 2005, Translation Team, www.luachina.net

    function Set.union (a,b) if getmetatable(a) ~= Set.mt or getmetatable(b) ~= Set.mt then error("attempt to `add' a set with a non-set value", 2) end ... -- same as before 1 13 3. .2 2 ܱ ܱ༢ ༢ᄎ ᄎෘ ෘ֥ ֥ M Me et ta am me et th ho od ds s Metatables ္ᄍྸ໡ૌ൐Ⴈ metamethodsğ__eqč֩ႿĎ đ__ltčཬႿĎ đބ__lečཬႿ ֩ႿĎ ۳ܱ༢ᄎෘژڮჍห൹֥ݣၬb ؓഺ༯֥೘۱ܱ༢ᄎෘژીႵህ૊֥ metamethodđ ၹູ Lua ࡼ a ~= b ሇߐູ not (a == b)Ġa > b ሇߐູ b < aĠa >= b ሇߐູ b <= ab čᆰ֞ Lua 4.0 ູᆸđ෮Ⴕ֥бࢠᄎෘژФሇߐӮ၂۱đa <= b ሇູ not (b < a)bಖ طᆃᇕሇߐѩ҂၂ᇁᆞಒb֒໡ૌმ֞ொ྽čpartial orderĎ౦ঃđ္ࣼ൞ඪđѩ҂൞෮ Ⴕ֥ჭ෍׻ॖၛᆞಒ֥Фஆ྽౦ঃb২ೂđᄝն؟ඔࠏఖഈڜׄඔ҂ିФஆ྽đၹູ෰ ֥ᆴ҂൞၂۱ඔሳčNot a Number ࠧ NaNĎ b۴ऌ IEEE 754 ֥ѓሙđNaN іൕ၂۱ໃק ၬ֥ᆴđбೂ 0/0 ֥ࢲݔbھѓሙᆷԛ಩ޅടࠣ֞ NaN бࢠ֥ࢲݔ׻ႋູ falseb္ࣼ൞ ඪđNaN <= x ሹ൞ falseđx < NaN ္ሹ൞ falsebᆃဢ၂টđᄝᆃᇕ౦ঃ༯ a <= b ሇߐ ູ not (b < a)ࣼ҂ᄜᆞಒਔb Ď ᄝ໡ૌܱႿࠎބҠቔ֥২ሰᇏđႵোර֥໙ีթᄝb<=սіࠢކ֥Їݣğa <= b і ൕࠢކ a ൞ࠢކ b ֥ሰࠢbᆃᇕၩၬ༯đॖି a <= b ބ b < a ׻൞ falseĠၹՎđ໡ૌླ ေࡼ__le ބ__lt ֥ൌགྷٳषğ Set.mt.__le = function (a,b) -- set containment for k in pairs(a) do if not b[k] then return false end end return true end Set.mt.__lt = function (a,b) return a <= b and not (b <= a) end ቋުđ໡ૌ๙ݖࠢކ֥Їݣটקၬࠢކཌྷ֩ğ Set.mt.__eq = function (a,b) return a <= b and b <= a end Ⴕਔഈ૫֥קၬᆭުđགྷᄝ໡ૌࣼॖၛটбࢠࠢކਔğ
  100. Programming in Lua 96 Copyright ® 2005, Translation Team, www.luachina.net

    s1 = Set.new{2, 4} s2 = Set.new{4, 10, 2} print(s1 <= s2) --> true print(s1 < s2) --> true print(s1 >= s1) --> true print(s1 > s1) --> false print(s1 == s2 * s1) --> true აෘඌᄎෘ֥ metamethods ҂๝đܱ༢ჭෘ֥ metamethods ҂ᆦӻࠁކো྘ᄎෘb ؓႿࠁކো྘бࢠᄎෘ֥ԩ৘ٚمބ Lua ֥܄܋ྛູোරbೂݔ୆൫๭бࢠ၂۱ሳژԱ ބ၂۱ඔሳđLua ࡼ஘ԛհ༂.ཌྷර֥đೂݔ୆൫๭бࢠਆ۱ջႵ҂๝ metamethods ֥ؓ འđLua ္ࡼ஘ԛհ༂b ֌ཌྷ֩бࢠՖট҂߶஘ԛհ༂đೂݔਆ۱ؓའႵ҂๝֥ metamethodđбࢠ֥ࢲݔູ falseđമᇀॖି҂߶טႨ metamethodbᆃ္൞ଆٟਔ Lua ֥܄܋֥ྛູđၹູ Lua ሹ൞ ಪູሳژԱބඔሳ൞҂֥֩đ ط҂ಀ஑؎෱ૌ֥ᆴb ࣇ֒ਆ۱Ⴕ܋๝֥ metamethod ֥ؓ འࣉྛཌྷ֩бࢠ֥ൈީđLua Ҍ߶טႨؓႋ֥ metamethodb 1 13 3. .3 3 ९ ९ק קၬ ၬ֥ ֥ M Me et ta am me et th ho od ds s ᄝ၂ུ९ᇏđᄝሱ֥࠭ metatables ᇏקၬሱ֥࠭თ൞ޓ௴ђ֥౦ঃb֞ଢభູᆸđ ໡ૌु֥֞෮Ⴕ metamethods ׻൞ Lua ނྏ҆ٳ֥bႵྴ୅ࠏڵᄳԩ৘ᄎෘژട֥ࠣ֞ metatables ބູᄎෘژקၬҠቔ֥ metamethodsb֌൞đmetatable ൞၂۱௴๙֥іđ಩ޅ ದ׻ॖၛ൐Ⴈb tostring ൞၂۱ׅ྘֥২ሰbೂభ૫໡ૌ෮࡮đtostring ၛࡥֆ֥۬ൔіൕԛ tableğ print({}) --> table: 0x8062ac0 čᇿၩğprint ݦඔሹ൞טႨ tostring ট۬ൔ߄෱֥ൻԛĎ bಖط֒۬ൔ߄၂۱ؓའ֥ ൈީđtostring ߶൮༵࡟Ұؓའ൞ڎթᄝ၂۱ջႵ__tostring თ֥ metatablebೂݔթᄝᄵ ၛؓའቔູҕඔטႨؓႋ֥ݦඔটປӮ۬ൔ߄đْ֥߭ࢲݔູࠧ tostring ֥ࢲݔb ᄝ໡ૌࠢކ֥২ሰᇏ໡ૌၘࣜקၬਔ၂۱ݦඔটࡼࠢކሇߐӮሳژԱյႆԛটbၹ Վđ໡ૌᆺླေࡼࠢކ֥ metatable ֥__tostring თטႨ໡ૌקၬ֥յႆݦඔğ Set.mt.__tostring = Set.tostring ᆃဢđ҂ܵ൉હൈީ໡ૌטႨ print յႆ၂۱ࠢކđprint ׻߶ሱ׮טႨ tostringđط tostring ᄵ߶טႨ Set.tostringğ s1 = Set.new{10, 4, 5} print(s1) --> {4, 5, 10} setmetatable/getmetatable ݦඔ္߶൐ Ⴈ metafieldđᄝᆃᇕ౦ ঃ༯đॖၛ Ќ޹
  101. Programming in Lua 97 Copyright ® 2005, Translation Team, www.luachina.net

    metatablesbࡌק୆མЌ޹୆֥ࠢކ൐ః൐Ⴈᆀ࠻ु҂္֞҂ିྩڿ metatablesbೂݔ୆ ؓ metatable ഡᇂਔ__metatable ֥ᆴđ getmetatable ࡼْ߭ᆃ۱თ֥ᆴđ طטႨ setmetatable ࡼ߶ԛհğ Set.mt.__metatable = "not your business" s1 = Set.new{} print(getmetatable(s1)) --> not your business setmetatable(s1, {}) stdin:1: cannot change protected metatable 1 13 3. .4 4 і іཌྷ ཌྷܱ ܱ֥ ֥ M Me et ta am me et th ho od ds s ܱႿෘඌᄎෘބܱ༢ჭෘ֥ metamethods ׻קၬਔհ༂ሑ෿֥ྛູđ෰ૌѩ҂ڿэ ე࿽Чദ֥ྛູbᆌؓᄝਆᇕᆞӈሑ෿ğі֥҂թᄝ֥თ֥Ұ࿘ބྩڿđLua ္ิ܂ਔ ڿэ tables ֥ྛູ֥ٚمb 1 13 3. .4 4. .1 1 T Th he e _ __ _i in nd de ex x M Me et ta am me et th ho od d భ૫ඪݖđ֒໡ૌ٠໙၂۱і֥҂թᄝ֥თđْ߭ࢲݔູ nilđᆃ൞ᆞಒ֥đ֌ѩ҂ ၂ᇁᆞಒbൌ࠽ഈđᆃᇕ٠໙Ԩؿ lua ࢳ൤ఖಀҰᅳ__index metamethodğೂݔ҂թᄝđ ْ߭ࢲݔູ nilĠೂݔթᄝᄵႮ__index metamethod ْ߭ࢲݔb ᆃ۱২ሰ֥ჰ྘൞၂ᇕ࠿ӵbࡌഡ໡ૌམԷࡹ၂ུіট૭ඍԳ१bૄ၂۱ісྶ૭ ඍԳ१֥၂ུҕඔđбೂğ໊ᇂđնཬđ࿾೤ڄ۬֩֩b෮Ⴕ֥ᆃུҕඔ׻Ⴕଏಪ֥ᆴđ ֒໡ૌམေԷࡹԳ१֥ൈީᆺླေ۳ԛ٤ଏಪᆴ֥ҕඔࠧॖԷࡹ໡ૌླေ֥Գ१bֻ၂ ᇕٚم൞đൌགྷ၂۱і֥ܒᄯఖđؓᆃ۱іଽ֥ૄ၂۱ಌഒთ׻แഈଏಪᆴbֻؽᇕٚ م൞đԷࡹ၂۱ྍ֥Գ१ಀ࠿ӵ၂۱ჰ྘Գ१֥ಌഒთb൮༵đ໡ૌൌགྷ၂۱ჰ྘ބ၂ ۱ܒᄯݦඔđ෰ૌ܋ཚ၂۱ metatableğ -- create a namespace Window = {} -- create the prototype with default values Window.prototype = {x=0, y=0, width=100, height=100, } -- create a metatable Window.mt = {} -- declare the constructor function function Window.new (o) setmetatable(o, Window.mt) return o end
  102. Programming in Lua 98 Copyright ® 2005, Translation Team, www.luachina.net

    གྷᄝ໡ૌקၬ__index metamethodğ Window.mt.__index = function (table, key) return Window.prototype[key] end ᆃဢ၂টđ໡ૌԷࡹ၂۱ྍ֥Գ१đಖު٠໙෰ಌഒ֥თࢲݔೂ༯ğ w = Window.new{x=10, y=20} print(w.width) --> 100 ֒ Lua ؿགྷ w ҂թᄝთ width ൈđ֌൞Ⴕ၂۱ metatable ջႵ__index თđLua ൐Ⴈ wčthe tableĎބ widthčಌഒ֥ᆴĎটטႨ__index metamethodđmetamethod ᄵ๙ݖ٠໙ ჰ྘іčprototypeĎࠆ౼ಌഒ֥თ֥ࢲݔb __index metamethod ᄝ࠿ӵᇏ֥൐Ⴈ٤ӈӈ࡮đ෮ၛ Lua ิ܂ਔ၂۱۷ࡥࢱ֥൐Ⴈ ٚൔb__index metamethod ҂ླေ٤൞၂۱ݦඔđ෰္ॖၛ൞၂۱іb֌෱൞၂۱ݦඔ ֥ൈީđLua ࡼ table ބಌഒ֥თቔູҕඔטႨᆃ۱ݦඔĠ֒෰൞၂۱і֥ൈީđLua ࡼ ᄝᆃ۱іᇏु൞ڎႵಌഒ֥თb෮ၛđഈ૫֥ପ۱২ሰॖၛ൐Ⴈֻؽᇕٚൔࡥֆ֥ڿཿ ູğ Window.mt.__index = Window.prototype གྷᄝđ֒ Lua Ұᅳ metatable ֥__index თൈđ෰ؿགྷ window.prototype ֥ᆴđ෱൞ ၂۱іđ෮ၛ Lua ࡼ٠໙ᆃ۱іটࠆ౼ಌഒ֥ᆴđ္ࣼ൞ඪ෱ཌྷ֒Ⴟᆳྛğ Window.prototype["width"] ࡼ၂۱іቔູ__index metamethod ൐Ⴈđิ܂ਔ၂ᇕ৷ࡎطࡥֆ֥ൌགྷֆ࠿ӵ֥ٚ مb၂۱ݦඔ֥սࡎෙಖ഍ັۚׄđ֌ิ܂ਔ۷؟֥ਲࠃྟğ໡ૌॖၛൌགྷ؟࠿ӵđႅ ҟđބః෰၂ུэၳ֥ࠏᇅb໡ૌࡼᄝֻ 16 ᅣབྷ༥֥ษં࠿ӵ֥ٚൔb ֒໡ૌམ҂๙ݖטႨ__index metamethod ট٠໙၂۱іđ ໡ૌॖၛ൐Ⴈ rawget ݦඔb Rawget(t,i)֥טႨၛ raw access ٚൔ٠໙іbᆃᇕ٠໙ٚൔ҂߶൐୆֥ս઒эॹčthe overhead of a function call kills any gain you could haveĎ đ֌Ⴕུൈީ໡ૌླေ෰đᄝު૫ ໡ૌࡼ߶ु֞b 1 13 3. .4 4. .2 2 T Th he e _ __ _n ne ew wi in nd de ex x M Me et ta am me et th ho od d __newindex metamethod Ⴈটؓі۷ྍđ__index ᄵႨটؓі٠໙b֒୆۳і֥၂۱ ಌഒ֥თڮᆴđࢳ൤ఖࣼ߶Ұᅳ__newindex metamethodğೂݔթᄝᄵטႨᆃ۱ݦඔط҂ ࣉྛڮᆴҠቔbཞ__index ၂ဢđೂݔ metamethod ൞၂۱іđࢳ൤ఖؓᆷק֥ପ۱іđ ط҂൞ჰ൓֥іࣉྛڮᆴҠቔbਸ਼ຓđႵ၂۱ raw ݦඔॖၛಡݖ metamethodğטႨ rawset(t,k,v)҂וႨ಩ޅ metamethod ؓі t ֥ k თڮᆴູ vb__index ބ__newindex metamethods ֥ࠁކ൐Ⴈิ܂ਔ఼ն֥ࢲܒğՖᆺ؀і֞૫ཟؓའщӱ֥ջႵ࠿ӵଏಪ ᆴ֥іbᄝᆃ၂ᅦ֥ഺჅ҆ٳ໡ૌु၂ུᆃུႋႨ֥২ሰđ૫ཟؓའ֥щӱᄝਸ਼ຓ֥ᅣ
  103. Programming in Lua 99 Copyright ® 2005, Translation Team, www.luachina.net

    ࢫࢺകb 1 13 3. .4 4. .3 3 Ⴕ Ⴕଏ ଏಪ ಪᆴ ᆴ֥ ֥і і ᄝ၂۱௴๙֥іᇏ಩ޅთ֥ଏಪᆴ׻൞ nilbޓಸၞ๙ݖ metatables টڿэଏಪᆴğ function setDefault (t, d) local mt = {__index = function () return d end} setmetatable(t, mt) end tab = {x=10, y=20} print(tab.x, tab.z) --> 10 nil setDefault(tab, 0) print(tab.x, tab.z) --> 10 0 གྷᄝđ҂ܵ൉હൈީ໡ૌ٠໙і֥ಌഒ֥თđ෰֥__index metamethod ФטႨѩْ ߭ 0bsetDefault ݦඔູૄ၂۱ླေଏಪᆴ֥іԷࡹਔ၂۱ྍ֥ metatablebᄝႵޓ؟֥і ླေଏಪᆴ֥౦ঃ༯đᆃॖି൐֤޽ٮ֥սࡎэնbಖط metatable Ⴕ၂۱ଏಪᆴ d ބ෱ Чദܱ৳đ෮ၛݦඔ҂ିູ෮Ⴕі൐Ⴈֆ၂֥၂۱ metatablebູਔх૧ջႵ҂๝ଏಪᆴ ֥෮Ⴕ֥і൐Ⴈֆ၂֥ metatableđ໡ૌࡼૄ۱і֥ଏಪᆴđ൐Ⴈ၂۱ື၂֥თթԥᄝі Чദ৚૫bೂݔ໡ૌ҂քྏଁ଀֥ࠁ੹đ໡ॖ൐Ⴈཞ"___"ቔູ໡ૌ֥ື၂֥თğ local mt = {__index = function (t) return t.___ end} function setDefault (t, d) t.___ = d setmetatable(t, mt) end ೂݔ໡ૌքྏଁ଀ࠁ੹đ္ޓಸၞЌᆣᆃ۱ห൹֥࡯ᆴື၂ྟb໡ૌေቓ֥ᆺ൞Է ࡹ၂۱ྍіႨቔ࡯ᆴğ local key = {} -- unique key local mt = {__index = function (t) return t[key] end} function setDefault (t, d) t[key] = d setmetatable(t, mt) end ਸ਼ຓ၂ᇕࢳथіބଏಪᆴܱ৳֥ٚم൞൐Ⴈ၂۱ٳष֥іটԩ৘đᄝᆃ۱ห൹֥і ᇏ෬ႄ൞іđ ؓႋ֥ᆴູଏಪᆴb ಖطᆃᇕٚم֥ᆞಒൌགྷ໡ૌླေ၂ᇕห൹֥іğ weak tableđ֞ଢభູᆸ໡ૌߎીႵࢺകᆃ҆ٳଽಸđࡼᄝֻ 17 ᅣษંb ູਔջႵ҂๝ଏಪᆴ֥іॖၛᇗႨཌྷ๝֥ჰіđߎႵ၂ᇕࢳथٚم൞൐Ⴈ memoize
  104. Programming in Lua 100 Copyright ® 2005, Translation Team, www.luachina.net

    metatablesđಖطᆃᇕٚم္ླေ weak tablesđ෮ၛ໡ૌᄜՑ҂֤҂ֻ֩֞ 17 ᅣb 1 13 3. .4 4. .4 4 ࡓ ࡓ॥ ॥і і __index ބ__newindex ׻൞ᆺႵ֒іᇏ٠໙֥თ҂թᄝൈީҌఏቔႨbѽࠆؓ၂۱ і֥෮Ⴕ٠໙౦ঃ֥ື၂ٚمࣼ൞ЌӻіູॢbၹՎđೂݔ໡ૌམࡓ॥၂۱і֥෮Ⴕ٠ ໙౦ঃđ໡ૌႋھູᆇൌ֥іԷࡹ၂۱ս৘bᆃ۱ս৘൞၂۱ॢіđѩ౏ջႵ__index ބ__newindex metamethodsđ Ⴎᆃਆ۱ٚمڵᄳ۵ሶі֥෮Ⴕ٠໙౦ঃѩࡼఃᆷཟჰ൓֥ іbࡌקđt ൞໡ૌམေ۵ሶ֥ჰ൓іđ໡ૌॖၛğ t = {} -- original table (created somewhere) -- keep a private access to original table local _t = t -- create proxy t = {} -- create metatable local mt = { __index = function (t,k) print("*access to element " .. tostring(k)) return _t[k] -- access the original table end, __newindex = function (t,k,v) print("*update of element " .. tostring(k) .. " to " .. tostring(v)) _t[k] = v -- update original table end } setmetatable(t, mt) ᆃ؍ս઒ࡼ۵ሶ෮Ⴕؓ t ֥٠໙౦ঃğ > t[2] = 'hello' *update of element 2 to hello > print(t[2]) *access to element 2 hello čᇿၩğ҂ྜྷ֥൞đᆃ۱ഡ࠹҂ᄍྸ໡ૌђ৥іbPairs ݦඔࡼؓ proxy ࣉྛҠቔđ
  105. Programming in Lua 101 Copyright ® 2005, Translation Team, www.luachina.net

    ط҂൞ჰ൓֥іb Ďೂݔ໡ૌམࡓ॥؟ᅦіđ໡ૌ҂ླေູૄ၂ᅦі׻ࡹ৫၂۱҂๝֥ metatableb໡ૌᆺေࡼૄ၂۱ proxy ބ෰ჰ൓֥іܱ৳đ෮Ⴕ֥ proxy ܋ཚ၂۱܄Ⴈ֥ metatable ࠧॖbࡼіބؓႋ֥ proxy ܱ৳֥၂۱ࡥֆ֥ٚم൞ࡼჰ൓֥іቔູ proxy ֥ თđᆺေ໡ૌЌᆣᆃ۱თ҂Ⴈቔః෰Ⴈ๯b၂۱ࡥֆ֥Ќᆣ෱҂Фቔ෰Ⴈ֥ٚم൞Էࡹ ၂۱඲Ⴕ֥ીႵ෰ದॖၛ٠໙֥ keybࡼഈ૫֥නམ߸ሹđቋᇔ֥ࢲݔೂ༯ğ -- create private index local index = {} -- create metatable local mt = { __index = function (t,k) print("*access to element " .. tostring(k)) return t[index][k] -- access the original table end __newindex = function (t,k,v) print("*update of element " .. tostring(k) .. " to " .. tostring(v)) t[index][k] = v -- update original table end } function track (t) local proxy = {} proxy[index] = t setmetatable(proxy, mt) return proxy end གྷᄝđ҂ܵ൉હൈީ໡ૌམࡓ॥і tđ໡ૌေቓ֤ᆺ൞ t=track(t)b 1 13 3. .4 4. .5 5 ᆺ ᆺ؀ ؀і і ҐႨս৘֥නམޓಸၞൌགྷ၂۱ᆺ؀іb໡ૌླေቓ֤ᆺ൞֒໡ૌࡓ॥֞ఒ๭ྩڿ іൈީ஘ԛհ༂b ๙ݖ__index metamethodđ ໡ૌॖၛ҂൐Ⴈݦඔط൞Ⴈჰ൓іЧദট൐ Ⴈіđၹູ໡ૌ҂ླေࡓ॥Ұ࿙bᆃ൞бࢠࡥֆѩ౏ི֥ۚᇗקཟ෮ႵҰ࿘֞ჰ൓і֥ ٚمb֌൞đᆃᇕႨمေ౰ૄ၂۱ᆺ؀ս৘Ⴕ၂۱ֆ׿֥ྍ֥ metatableđ൐Ⴈ__index ᆷཟჰ൓іğ function readOnly (t)
  106. Programming in Lua 102 Copyright ® 2005, Translation Team, www.luachina.net

    local proxy = {} local mt = { -- create metatable __index = t, __newindex = function (t,k,v) error("attempt to update a read-only table", 2) end } setmetatable(proxy, mt) return proxy end č࠺ᇾğerror ֻ֥ؽ۱ҕඔ 2đࡼհ༂ྐ༏ْ߭۳ఒ๭ᆳྛ update ֹ֥ٚĎቔູ၂ ۱ࡥֆ֥২ሰđ໡ૌؓ۽ቔರࡹ৫၂۱ᆺ؀іğ days = readOnly{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} print(days[1]) --> Sunday days[2] = "Noday" stdin:1: attempt to update a read-only table
  107. Programming in Lua 103 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 14 ᅣ ߌ࣢ Lua Ⴈ၂۱଀ູ environment ௴๙֥іটЌթ෮Ⴕ֥ಆअэਈb č۷ࣚಒ֥ඪđLua ᄝ၂༢ਙ֥ environment ᇏЌթ෰֥oglobalpэਈđ֌൞໡ૌႵൈީॖၛޭ੻ᆃᇕ؟ဢ ྟĎᆃᇕࢲݔ֥Ⴊׄᆭ၂൞෰ࡥ߄ਔ Lua ֥ଽ҆ൌགྷđၹູؓႿ෮Ⴕ֥ಆअэਈીႵс ေ٤ေႵ҂๝֥ඔऌࢲܒbਸ਼၂۱(ᇶေ֥)Ⴊׄ൞໡ૌॖၛཞః෰і၂ဢҠቔᆃ۱Ќթ ಆअэਈ֥іbູਔࡥ߄ҠቔđLua ࡼߌ࣢Чദթԥᄝ၂۱ಆअэਈ_G ᇏđ č_G._G ֩ Ⴟ_GĎ b২ೂđ༯૫ս઒յႆᄝ֒భߌ࣢ᇏ෮Ⴕ֥ಆअэਈ֥଀ሳğ for n in pairs(_G) do print(n) end ᆃ၂ᅣ໡ૌࡼษં၂ུೂޅҠሺߌ࣢֥ႵႨ֥࠯ඌb 1 14 4. .1 1 ൐ ൐Ⴈ Ⴈ׮ ׮෿ ෿଀ ଀ሳ ሳ٠ ٠໙ ໙ಆ ಆअ अэ эਈ ਈ ๙ӈđڮᆴҠቔؓႿ٠໙ބྩڿಆअэਈၘࣜቀܔbಖطđ໡ૌࣜӈླေ၂ུჰщ ӱčmeta-programmingĎ֥ٚൔđбೂ֒໡ૌླေҠሺ၂۱଀ሳФթԥᄝਸ਼၂۱эਈᇏ ֥ಆअэਈđࠇᆀླေᄝᄎྛൈҌିᆩ֥֡ಆअэਈbູਔࠆ౼ᆃᇕಆअэਈ֥ᆴđႵ ֥ӱ྽ჴॖିཿԛ༯૫োර֥ս઒ğ loadstring("value = " .. varname)() or value = loadstring("return " .. varname)() ೂݔ varname ൞ xđ ഈ૫৵ࢤҠቔ֥ࢲݔູğ "return x" čֻ၂ᇕྙൔູ "value = x"Ď đ ֒ᄎྛൈҌ߶Ӂളቋᇔ֥ࢲݔbಖطᆃ؍ս઒ടࠣ֞၂۱ྍ֥ chunk ֥Էࡹބщၲၛࠣ ః෰ޓ؟حຓ֥໙ีb୆ॖၛߐᇕٚൔ۷ིۚ۷ࡥࢱ֥ປӮ๝ဢ֥ۿିđս઒ೂ༯ğ value = _G[varname] ၹູߌ࣢൞၂۱௴๙֥іđ෮ၛ୆ॖၛ൐Ⴈ୆ླေࠆ౼֥эਈčэਈ଀Ď෬ႄіࠧ ॖb ္ॖၛႨཌྷර֥ٚൔؓ၂۱ಆअэਈڮᆴğ_G[varname] = valuebཬྏğ၂ུӱ྽ ჴؓᆃུݦඔޓྖٹđѩ౏ॖିཿԛᆃဢ֥ս઒ğ_G["a"] = _G["var1"]đᆃᆺ൞ a = var1 ֥گᄖ֥ཿمطၘb ؓభ૫֥໙ีۀও၂༯đіთॖၛ൞྘ೂ"io.read" or "a.b.c.d"֥׮෿଀ሳb໡ૌႨ࿖ ߌࢳथᆃ۱໙ีđՖ_G ष൓đ၂۱თ၂۱თ֥ђ৥ğ function getfield (f) local v = _G -- start with the table of globals
  108. Programming in Lua 104 Copyright ® 2005, Translation Team, www.luachina.net

    for w in string.gfind(f, "[%w_]+") do v = v[w] end return v end ໡ૌ൐Ⴈ string ९֥ gfind ݦඔটםս f ᇏ֥෮ႵֆՍ čֆՍᆷ၂۱ࠇ؟۱ሰଛ༯߃ ཌ֥྽ਙĎ bཌྷؓႋ֥đഡᇂ၂۱თ֥ݦඔ഍ັگᄖུbڮᆴೂğ a.b.c.d.e = v ൌ࠽֩ࡎႿğ local temp = a.b.c.d temp.e = v ္ࣼ൞ඪđ໡ૌсྶ࠺ᇾቋު၂۱଀ሳđсྶ׿৫֥ԩ৘ቋު၂۱თbྍ֥ setfield ݦඔ֒ఃᇏ֥თčၲᆀᇿğᇏࡗ֥თड़ק൞іĎ҂թᄝ֥ൈީߎླေԷࡹᇏࡗіb function setfield (f, v) local t = _G -- start with the table of globals for w, d in string.gfind(f, "([%w_]+)(.?)") do if d == "." then -- not last field? t[w] = t[w] or {} -- create table if absent t = t[w] -- get the table else -- last field t[w] = v -- do the assignment end end end ᆃ۱ྍ֥ଆൔ௄஥ၛэਈ w ࡆഈ၂۱ॖ࿊֥ׄčЌթᄝэਈ d ᇏĎ֥თbೂݔ၂۱ თ଀ު૫҂ᄍྸ۵ഈׄđ іૼ෱൞ቋު၂۱଀ሳb č໡ૌࡼᄝֻ 20 ᅣษંଆൔ௄஥໙ีĎ b ൐Ⴈഈ૫֥ݦඔ setfield("t.x.y", 10) Էࡹ၂۱ಆअэਈі tđਸ਼၂۱і t.xđѩ౏ؓ t.x.y ڮᆴູ 10ğ print(t.x.y) --> 10 print(getfield("t.x.y")) --> 10 1 14 4. .2 2 ല ലૼ ૼಆ ಆअ अэ эਈ ਈ ಆअэਈ҂ླေലૼđෙಖᆃؓ၂ུཬӱ྽টඪޓٚьđ֌ӱ྽ޓնൈđ၂۱ࡥֆ
  109. Programming in Lua 105 Copyright ® 2005, Translation Team, www.luachina.net

    ֥௓ཿհ༂ॖିႄఏ bug ѩ౏ޓ଴ؿགྷbಖطđೂݔ໡ૌ༟ߋđ໡ૌॖၛڿэᆃᇕྛູb ၹູ Lua ෮Ⴕ֥ಆअэਈ׻Ќթᄝ၂۱௴๙֥іᇏđ໡ૌॖၛ൐Ⴈ metatables টڿэ٠ ໙ಆअэਈ֥ྛູb ֻ၂۱ٚمೂ༯ğ setmetatable(_G, { __newindex = function (_, n) error("attempt to write to undeclared variable "..n, 2) end, __index = function (_, n) error("attempt to read undeclared variable "..n, 2) end, }) ᆃဢ၂টđ಩ޅఒ๭٠໙၂۱҂թᄝ֥ಆअэਈ֥Ҡቔ׻߶ႄఏհ༂ğ > a = 1 stdin:1: attempt to write to undeclared variable a ֌൞໡ૌೂޅലૼ၂۱ྍ֥эਈ଻Ĥ൐Ⴈ rawsetđॖၛಡݖ metamethodğ function declare (name, initval) rawset(_G, name, initval or false) end or ջႵ false ൞ູਔЌᆣྍ֥ಆअэਈ҂߶ູ nilbᇿၩğ୆ႋھᄝνል٠໙॥ᇅ ၛభčbefore installing the access controlĎקၬᆃ۱ݦඔđڎᄵࡼ֤֞հ༂ྐ༏ğиࣨ୆ ൞ᄝఒ๭Էࡹ၂۱ྍ֥ಆअലૼbᆺေېҌପ۱ݦඔᄝᆞಒֹ֥ٚđ୆ࣼॖၛ॥ᇅ୆֥ ಆअэਈਔğ > a = 1 stdin:1: attempt to write to undeclared variable a > declare "a" > a = 1 -- OK ֌൞གྷᄝđູਔҩ൫၂۱эਈ൞ڎթᄝđ໡ૌ҂ିࡥֆ֥бࢠ෰൞ڎູ nilbೂݔ෰ ൞ nil ٠໙ࡼ஘ԛհ༂b෮ၛđ໡ૌ൐Ⴈ rawget ಡݖ metamethodğ if rawget(_G, var) == nil then -- 'var' is undeclared ... end ڿэ॥ᇅᄍྸಆअэਈॖၛູ nil ္҂଴đ෮Ⴕ໡ૌླေ֥൞Էࡹ၂۱ڣᇹіႨট
  110. Programming in Lua 106 Copyright ® 2005, Translation Team, www.luachina.net

    Ќթ෮Ⴕၘࣜലૼ֥эਈ֥଀ሳb ҂ܵ൉હൈީ metamethod ФטႨ֥ൈީđ ෰߶࡟Ұᆃ ᅦڣᇹіुэਈ൞ڎၘࣜթᄝbս઒ೂ༯ğ local declaredNames = {} function declare (name, initval) rawset(_G, name, initval) declaredNames[name] = true end setmetatable(_G, { __newindex = function (t, n, v) if not declaredNames[n] then error("attempt to write to undeclared var. "..n, 2) else rawset(t, n, v) -- do the actual set end end, __index = function (_, n) if not declaredNames[n] then error("attempt to read undeclared var. "..n, 2) else return nil end end, }) ਆᇕൌགྷٚൔđսࡎ׻ޓཬॖၛޭ੻҂࠹֥bֻ၂ᇕࢳथٚمğmetamethods ᄝ௜ ӈҠቔᇏ҂߶ФטႨbֻؽᇕࢳथٚمğ෰ૌॖିФטႨđ҂ݖ֒౏ࣇ֒٠໙၂۱ᆴູ nil ֥эਈൈb 1 14 4. .3 3 ٤ ٤ಆ ಆअ अ֥ ֥ߌ ߌ࣢ ࣢ ಆअߌ࣢֥၂۱໙ี൞đ಩ޅྩڿ׻߶႕ཙ୆֥ӱ྽֥෮Ⴕ҆ٳb২ೂđ֒୆νል ၂۱ metatable ಀ॥ᇅಆअ٠໙ൈđ୆֥ᆜ۱ӱ྽׻сྶ቎࿖๝၂۱ᆷ֝ٚᆌbೂݔ୆མ ൐Ⴈѓሙ९đѓሙ९ᇏॖି൐Ⴈ֞ીႵലૼ֥ಆअэਈđ୆ࡼஷ֞ߊᄎb Lua 5.0 ᄍྸૄ۱ݦඔॖၛႵሱ֥࠭ߌ࣢টڿ೿ᆃ۱໙ีđ๐ఏটᆃޓఅܯĠиࣨđ ಆअэਈі֥ଢ֥ࣼ൞ູਔಆअྟ൐Ⴈb ಖطᄝ Section 15.4 ໡ૌࡼु֞ᆃ۱ࠏᇅջটޓ ؟Ⴕ౿֥ࢲܒđಆअ֥ᆴ၇ಖ൞ෛԩॖၛࠆ౼֥b ॖၛ൐Ⴈ setfenv ݦඔটڿэ၂۱ݦඔ֥ߌ࣢bSetfenv ࢤ൳ݦඔބྍ֥ߌ࣢ቔູҕ ඔbԢਔ൐ႨݦඔЧദđߎॖၛᆷק၂۱ඔሳіൕᅜפ֥ࠃ׮ݦඔbඔሳ 1 սі֒భݦ ඔđඔሳ 2 սіטႨ֒భݦඔ֥ݦඔčᆃؓཿ၂۱ڣᇹݦඔটڿэ෰ૌטႨᆀ֥ߌ࣢൞
  111. Programming in Lua 107 Copyright ® 2005, Translation Team, www.luachina.net

    ޓٚь֥Ď၇Վো๷b༯૫ᆃ؍ս઒൞ఒ๭ႋႨ setfenv ാϧ֥২ሰğ a = 1 -- create a global variable -- change current environment to a new empty table setfenv(1, {}) print(a) ֝ᇁğ stdin:5: attempt to call global `print' (a nil value) č୆сྶᄝֆ׿֥ chunk ଽᄎྛᆃ؍ս઒đೂݔ୆ᄝࢌ޺ଆൔᇯྛᄎྛ෰đૄ၂ྛ ׻൞၂۱҂๝֥ݦඔđטႨ setfenv ᆺ߶႕ཙ෰ሱ֥࠭ପ၂ྛb Ď၂֊୆ڿэਔ୆֥ߌ࣢đ ෮Ⴕಆअ٠໙׻൐Ⴈᆃ۱ྍ֥іđೂݔෲູॢđ୆ࣼשാ෮Ⴕ୆֥ಆअэਈđമᇀ_Gđ ෮ၛđ୆ႋھ൮༵൐Ⴈ၂ུႵႨ֥ᆴٿልčpopulateĎෲđбೂ঺֥ߌ࣢ğ a = 1 -- create a global variable -- change current environment setfenv(1, {_G = _G}) _G.print(a) --> nil _G.print(_G.a) --> 1 གྷᄝđ֒୆٠໙"global" _Gđ෰֥ᆴູ֥ࣸߌ࣢đఃᇏ୆ॖၛ൐Ⴈ print ݦඔb ୆္ॖၛ൐Ⴈ࠿ӵٿል(populate)୆֥ྍ֥ߌ࣢ğ a = 1 local newgt = {} -- create new environment setmetatable(newgt, {__index = _G}) setfenv(1, newgt) -- set it print(a) --> 1 ᄝᆃ؍ս઒ྍ֥ߌ࣢Ֆ֥ࣸߌ࣢ᇏ࠿ӵਔ print ބ aĠಖطđ಩ޅڮᆴҠቔ׻ؓྍі ࣉྛđ҂Ⴈքྏ༂Ҡቔྩڿਔಆअэਈіbਸ਼ຓđ୆ಯಖॖၛ๙ݖ_G ྩڿಆअэਈğ -- continuing previous code a = 10 print(a) --> 10 print(_G.a) --> 1 _G.a = 20 print(_G.a) --> 20 ֒୆Էࡹ၂۱ྍ֥ݦඔൈđ෰ՖԷࡹ෰֥ݦඔ࠿ӵਔߌ࣢эਈb෮ၛđೂݔ၂۱ chunk ڿэਔ෰ሱ֥࠭ߌ࣢đᆃ۱ chunk ෮Ⴕᄝڿэᆭުקၬ֥ݦඔ׻܋ཚཌྷ๝֥ߌ࣢đ ׻߶൳֞႕ཙbᆃؓԷࡹଁ଀ॢࡗ൞٤ӈႵႨ֥ࠏᇅđ໡ૌ༯၂ᅣࡼ߶ु֞b
  112. Programming in Lua 109 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 15 ᅣ Packages ޓ؟ე࿽ህ૊ิ܂ਔଖᇕࠏᇅቆᆮಆअэਈ֥ଁ଀đбೂ Modula ֥ modulesđJava ބ Perl ֥ packagesđC++֥ namespacesbૄ၂ᇕࠏᇅؓᄝ package ᇏലૼ֥ჭ෍֥ॖ࡮ ྟၛࠣః෰၂ུ༥ࢫ֥൐Ⴈ׻Ⴕ҂๝֥ܿᄵb֌൞෰ૌ׻ิ܂ਔ၂ᇕх૧҂๝९ᇏଁ଀ Ԋ๬֥໙ี֥ࠏᇅbૄ၂۱ӱ྽९Էࡹሱ֥࠭ଁ଀ॢࡗđᄝᆃ۱ଁ଀ॢࡗᇏקၬ֥଀ሳ ބః෰ଁ଀ॢࡗᇏקၬ֥଀ሳ޺҂ۄടb Lua ѩીႵิ܂ૼಒ֥ࠏᇅটൌགྷ packagesbಖطđ໡ૌ๙ݖე࿽ิ܂֥ࠎЧ֥ࠏ ᇅޓಸၞൌགྷ෰bᇶေ֥නམ൞ğཞѓሙ९၂ဢđ൐Ⴈіট૭ඍ packageb ൐Ⴈіൌགྷ packages ֥ૼཁ֥ݺԩ൞ğ໡ૌॖၛཞః෰і၂ဢ൐Ⴈ packagesđѩ౏ ॖၛ൐Ⴈე࿽ิ܂֥෮Ⴕ֥ۿିđջটޓ؟ь০bն؟ඔე࿽ᇏđpackages ҂൞ֻ၂ো ᆴ(first-class values)č္ࣼ൞ඪđ෰ૌ҂ିթԥᄝэਈ৚đ҂ିቔູݦඔҕඔb b b ĎၹՎđ ᆃུე࿽ླေห൹֥ٚمބ࠯ెҌିൌགྷোර֥ۿିb Lua ᇏđෙಖ໡ૌ၂ᆰ׻Ⴈіটൌགྷ pachagesđ֌္Ⴕః෰҂๝֥ٚمॖၛൌགྷ packageđᄝᆃ၂ᅣđ໡ૌࡼࢺകᆃུٚمb 1 15 5. .1 1 ࠎ ࠎЧ Чٚ ٚم م ֻ၂Ї֥ࡥֆ֥ٚم൞ؓЇଽ֥ૄ၂۱ؓའభ׻ࡆЇ଀ቔູభሗb২ೂđࡌק໡ૌ ᆞᄝཿ၂۱Ҡቔگඔ֥९ğ໡ૌ൐ႨіটіൕگඔđіႵਆ۱თ rčൌඔ҆ٳĎބ ičྴ ඔ҆ٳĎ b໡ૌᄝਸ਼၂ᅦіᇏലૼ໡ૌ෮Ⴕ֥Ҡቔটൌགྷ၂۱Їğ complex = {} function complex.new (r, i) return {r=r, i=i} end -- defines a constant `i' complex.i = complex.new(0, 1) function complex.add (c1, c2) return complex.new(c1.r + c2.r, c1.i + c2.i) end function complex.sub (c1, c2) return complex.new(c1.r - c2.r, c1.i - c2.i) end
  113. Programming in Lua 110 Copyright ® 2005, Translation Team, www.luachina.net

    function complex.mul (c1, c2) return complex.new(c1.r*c2.r - c1.i*c2.i, c1.r*c2.i + c1.i*c2.r) end function complex.inv (c) local n = c.r^2 + c.i^2 return complex.new(c.r/n, -c.i/n) end return complex ᆃ۱९קၬਔ၂۱ಆअ଀ğcoplexbః෰֥קၬ׻൞٢ᄝᆃ۱іଽb Ⴕਔഈ૫֥קၬđ໡ૌࣼॖၛ൐Ⴈژކ֥ܿٓ಩ޅگඔҠቔਔđೂğ c = complex.add(complex.i, complex.new(10, 20)) ᆃᇕ൐Ⴈіটൌགྷ֥Їބᆇᆞ֥Ї֥ۿିѩ҂ປಆཌྷ๝b൮༵đ໡ૌؓૄ၂۱ݦඔ קၬ׻сྶཁൕ֥ᄝభ૫ࡆഈЇ֥଀ӫbֻؽđ๝၂Їଽ֥ݦඔཌྷ޺טႨсྶᄝФטႨ ݦඔభᆷקЇ଀b໡ૌॖၛ൐Ⴈܥק֥अ҆эਈ଀đটڿ೿ᆃ۱໙ีđಖުđࡼᆃ۱अ ҆эਈڮᆴ۳ቋᇔ֥Їb၇ऌᆃ۱ჰᄵđ໡ૌᇗཿഈ૫֥ս઒ğ local P = {} complex = P -- package name P.i = {r=0, i=1} function P.new (r, i) return {r=r, i=i} end function P.add (c1, c2) return P.new(c1.r + c2.r, c1.i + c2.i) end ... ֒ᄝ๝၂۱Їଽ֥၂۱ݦඔטႨਸ਼၂۱ݦඔ֥ൈީ čࠇᆀෲטႨሱദĎ đ ෰ಯಖླေ ࡆഈభሗ଀bᇀഒđ෱҂ᄜ၇ঠႿܥק֥Ї଀bਸ਼ຓđᆺႵ၂۱ֹٚླေЇ଀bॖି୆ ᇿၩ֞Їᇏቋު၂۱ეओğ return complex ᆃ۱ return ეओѩ٤сླ֥đၹູ package ၘࣜڮᆴ۳ಆअэਈ complex ਔb֌൞đ ໡ૌಪູ package յष֥ൈީْ߭Чദ൞၂۱ޓݺ֥༝ܸbحຓْ֥߭ეओѩ҂߶޽ٮ ൉હսࡎđѩ౏ิ܂ਔਸ਼၂ᇕҠቔ package ֥ॖ࿊ٚൔb
  114. Programming in Lua 111 Copyright ® 2005, Translation Team, www.luachina.net

    1 15 5. .2 2 ඲ ඲Ⴕ ႵӮ Ӯჴ ჴč čP Pr ri iv va ac cy yĎ Ď Ⴕൈީđ၂۱ package ܄ष෰֥෮Ⴕଽಸđ္ࣼ൞ඪđ಩ޅ package ֥ग़޼؊׻ॖ ၛ٠໙෰bಖطđ၂۱ package ႚႵሱ֥࠭඲Ⴕ҆ٳč္ࣼ൞ᆺႵ package ЧദҌି٠ ໙Ď္൞ޓႵႨ֥bᄝ Lua ᇏ၂۱Ԯ๤֥ٚم൞ࡼ඲Ⴕ҆ٳקၬູअ҆эਈটൌགྷb২ ೂđ໡ૌྩڿഈ૫֥২ሰᄹࡆ඲Ⴕݦඔট࡟Ұ၂۱ᆴ൞ڎູႵི֥گඔğ local P = {} complex = P local function checkComplex (c) if not ((type(c) == "table") and tonumber(c.r) and tonumber(c.i)) then error("bad complex number", 3) end end function P.add (c1, c2) checkComplex(c1); checkComplex(c2); return P.new(c1.r + c2.r, c1.i + c2.i) end ... return P ᆃᇕٚൔ۲Ⴕ൉હႪׄބಌׄ଻Ĥpackage ᇏ෮Ⴕ֥଀ሳ׻ᄝ၂۱׿৫֥ଁ଀ॢࡗ ᇏbPackage ᇏ֥ૄ၂۱ൌุčentityĎ׻ౢԣֹѓ࠺ູ܄Ⴕߎ൞඲Ⴕbਸ਼ຓđ໡ૌൌགྷ ၂۱ᆇᆞ֥ႅ඲čprivacyĎ ğ඲Ⴕൌุᄝ package ຓ҆൞҂ॖ٠໙֥bಌׄ൞٠໙๝၂۱ package ଽ֥ః෰܄Ⴕ֥ൌุཿم಺Ⴥđсྶࡆഈభሗ P.bߎႵ၂۱ն֥໙ี൞đ֒໡ૌ ྩڿݦඔ֥ሑ෿(܄ႵэӮ඲Ⴕࠇᆀ඲ႵэӮ܄Ⴕ)໡ૌсྶྩڿݦඔ֤טႨٚൔb Ⴕ၂۱Ⴕ౿֥ٚمॖၛ৫ख़ࢳथᆃਆ۱໙ีb໡ૌॖၛࡼ package ଽ֥෮Ⴕݦඔ׻ ലૼູअ֥҆đቋުࡼ෰ૌ٢ᄝቋᇔ֥іᇏbοᅶᆃᇕٚمđഈ૫֥ complex package ྩڿೂ༯ğ local function checkComplex (c) if not ((type(c) == "table") and tonumber(c.r) and tonumber(c.i)) then error("bad complex number", 3) end
  115. Programming in Lua 112 Copyright ® 2005, Translation Team, www.luachina.net

    end local function new (r, i) return {r=r, i=i} end local function add (c1, c2) checkComplex(c1); checkComplex(c2); return new(c1.r + c2.r, c1.i + c2.i) end ... complex = { new = new, add = add, sub = sub, mul = mul, div = div, } གྷᄝ໡ૌ҂ᄜླေטႨݦඔ֥ൈީᄝభ૫ࡆഈభሗđ܄Ⴕ֥ބ඲Ⴕ֥ݦඔטႨٚم ཌྷ๝bᄝ package ֥ࢲແԩđႵ၂۱ࡥֆ֥ਙіਙԛ෮Ⴕ܄Ⴕ֥ݦඔbॖିն؟ඔದत ֤ᆃ۱ਙі٢ᄝ package ֥ष൓ԩ۷ሱಖđ֌໡ૌ҂ିᆃဢቓđၹູ໡ૌсྶ൮༵קၬ अ҆ݦඔb 1 15 5. .3 3 Ї Їა ა໓ ໓ࡱ ࡱ ໡ૌࣜӈཿ၂۱ package ಖުࡼ෮Ⴕ֥ս઒٢֞၂۱ֆ׿֥໓ࡱᇏbಖު໡ૌᆺླ ေᆳྛᆃ۱໓ࡱࠧࡆᄛ packageb২ೂđೂݔ໡ૌࡼഈ૫໡ૌ֥گඔ֥ package ս઒٢֞ ၂۱໓ࡱ complex.lua ᇏđଁ਷orequire complexpࡼյषᆃ۱ packageb࠺ᇾ require ଁ ਷҂߶ࡼཌྷ๝֥ package ࡆᄛ؟Ցb ླေᇿၩ֥໙ี൞đ۞ౢԣЌթ package ֥໓ࡱ଀ބ package ଀֥ܱ༢b֒ಖđࡼ ෰ૌ৳༢ఏট൞၂۱ݺ֥མمđၹູ require ଁ਷൐Ⴈ໓ࡱط҂൞ packagesb၂ᇕࢳथٚ م൞ᄝ package ֥ު૫ࡆഈުሗčбೂ.luaĎটଁ଀໓ࡱbLua ѩ҂ླေܥק֥ঔᅚ଀đ ط൞Ⴎ୆֥ਫ਼ࣥഡᇂथקb২ೂđೂݔ୆֥ਫ਼ࣥЇݣğ"/usr/local/lualibs/?.lua"đପહگ ඔ package ॖିЌթᄝ၂۱ complex.lua ໓ࡱᇏb Ⴕུದ༟ߋ༵ଁ଀໓ࡱުଁ଀ packageb္ࣼ൞ඪđೂݔ୆ᇗଁ଀໓ࡱđpackage ္ ߶Фᇗଁ଀bᆃ۱ࢳथٚمิ܂ਔޓն֥ਲࠃྟb২ೂđೂݔ୆Ⴕਆ۱Ⴕཌྷ๝଀ӫ֥ packageđ୆҂ླေྩڿ಩ޅ၂۱đᆺླေᇗଁ଀၂༯໓ࡱbᄝ Lua ᇏ໡ૌ൐Ⴈ _REQUIREDNAME эਈটᇗଁ଀b࠺ᇾđ֒ require ࡆᄛ၂۱໓ࡱ֥ൈީđ෱קၬਔ၂
  116. Programming in Lua 113 Copyright ® 2005, Translation Team, www.luachina.net

    ۱эਈটіൕྴ୅֥໓ࡱ଀bၹՎđᄝ୆֥ package ᇏॖၛᆃဢཿğ local P = {} -- package if _REQUIREDNAME == nil then complex = P else _G[_REQUIREDNAME] = P end ս ઒ ᇏ ֥ if ҩ ൫ ൐֤໡ ૌ ॖၛ ҂ླ ေ require ࣼ ॖၛ ൐Ⴈ packageb ೂ ݔ _REQUIREDNAME ીႵקၬđ ໡ૌႨܥק֥଀ሳіൕ package č২ሰᇏ complexĎ b ਸ਼ຓđ package ൐Ⴈྴ୅໓ࡱ଀ᇿҨ෰ሱ࠭bೂݔၛ൐Ⴈᆀࡼ९٢֞໓ࡱ cpx.lua ᇏѩ౏ᄎྛ require cpxđପહ package ࡼЧദࡆᄛ֞і cpx ᇏbೂݔః෰֥൐Ⴈᆀࡼ९ڿ଀ູ cpx_v1.lua ѩ౏ᄎྛ require cpx_v1đପહ package ࡼሱ׮ࡼЧദࡆᄛ֞і cpx_v1 ֒ᇏb 1 15 5. .4 4 ൐ ൐Ⴈ Ⴈಆ ಆअ अі і ഈ૫ᆃུԷࡹ package ֥ٚم֥ಌׄ൞ğ෰ૌေ౰ӱ྽ჴᇿၩޓ؟ת༆đбೂđᄝ ലૼ֥ൈީ္ޓಸၞອו local ܱ࡯ሳb ಆअэਈі֥ Metamethods ิ܂ਔ၂ུႵ౿֥࠯ ඌđ္ॖၛႨটൌགྷ packagebᆃུ࠯ඌᇏ܋๝ᆭԩᄝႿğpackage ൐Ⴈ׿ᅝ֥ߌ࣢bᆃ ޓಸၞൌགྷğ ೂݔ໡ૌڿэਔ package ᇶ chunk ֥ߌ࣢đ ପહႮ package Էࡹ֥෮Ⴕݦඔ ׻܋ཚᆃ۱ྍ֥ߌ࣢b ቋࡥֆ֥࠯ඌൌགྷb၂֊ package Ⴕ၂۱׿ᅝ֥ߌ࣢đ҂ࣇ෮Ⴕෲ֥ݦඔ܋ཚߌ࣢đ ط౏෱֥෮Ⴕಆअэਈ္܋ཚᆃ۱ߌ࣢b෮ၛđ໡ૌॖၛࡼ෮Ⴕ֥܄Ⴕݦඔലૼູಆअ эਈđಖު෰ૌ߶ሱ׮ቔູ׿৫֥іčіᆷ package ֥଀ሳĎթᄝđ෮Ⴕ package сྶ ေቓ֥൞ࡼᆃ۱іᇿҨູ package ֥଀ሳb༯૫ᆃ؍ս઒ӂඍਔگඔ९൐Ⴈᆃᇕ࠯ඌ֥ ࢲݔğ local P = {} complex = P setfenv(1, P) གྷᄝđ֒໡ૌലૼݦඔ add,ෲ߶ሱ׮эӮ complex.add: function add (c1, c2) return new(c1.r + c2.r, c1.i + c2.i) end ਸ਼ຓđ໡ૌॖၛᄝᆃ۱ package ᇏ҂ླေభሗטႨః෰֥ݦඔb২ೂđadd ݦඔטႨ new ݦඔđߌ࣢߶ሱ׮ሇߐູ complex.newbᆃᇕٚمิ܂ਔؓ package ޓݺ֥ᆦӻğӱ ྽ჴࠫެ҂ླေቓ൉હحຓ֥۽ቔđטႨ๝၂۱ package ଽ֥ݦඔ҂ླေభሗđטႨ܄ Ⴕބ඲Ⴕݦඔ္ી൉હ౵љb ೂݔӱ྽ჴອ࠺ਔ local ܱ࡯ሳđ ္҂߶໪ಙಆअଁ଀ॢࡗđ
  117. Programming in Lua 114 Copyright ® 2005, Translation Team, www.luachina.net

    ᆺ҂ݖ൐֤඲ႵݦඔэӮ܄Ⴕݦඔطၘbਸ਼ຓđ໡ૌॖၛࡼᆃᇕ࠯ඌބభ၂ࢫ໡ૌ൐Ⴈ ֥ package ଀֥ٚمቆކఏটğ local P = {} -- package if _REQUIREDNAME == nil then complex = P else _G[_REQUIREDNAME] = P end setfenv(1, P) ᆃဢࣼ҂ି٠໙ః෰֥ packages ਔb၂֊໡ૌࡼ၂۱ॢі P ቔູ໡ૌ֥ߌ࣢đ໡ૌ ࣼാಀਔ٠໙෮Ⴕၛభ֥ಆअэਈb༯૫Ⴕݺࠫᇕٚمॖၛࢳथᆃ۱໙ีđ֌׻۲Ⴕ০ рb ቋࡥֆ֥ࢳथٚم൞൐Ⴈ࠿ӵđཞభ૫໡ૌु֥֞၂ဢğ local P = {} -- package setmetatable(P, {__index = _G}) setfenv(1, P) č୆сྶᄝטႨ setfenv ᆭభטႨ setmetatableđ୆ିඪԛჰၹહĤĎ൐Ⴈᆃᇕࢲܒđ package ࣼॖၛᆰࢤ٠໙෮Ⴕ֥ಆअѓൕژđ֌сྶູૄ၂۱٠໙ڱԛ၂ཬׄսࡎb৘ ંഈটࢃđᆃᇕࢳथٚمջট၂۱Ⴕ౿֥ࢲݔğ୆֥ package གྷᄝЇݣਔ෮Ⴕ֥ಆअэ ਈb ২ೂđ ൐Ⴈ୆֥ package ದ္ॖၛטႨѓሙ९֥ sin ݦඔğ complex.math.sin(x)b čPerl's package ༢๤္ႵᆃᇕหྟĎ ਸ਼ຓ၂ᇕॹ෎֥٠໙ః෰ packages ֥ٚم൞ലૼ၂۱अ҆эਈটЌթ঺֥ߌ࣢ğ local P = {} pack = P local _G = _G setfenv(1, P) གྷᄝđ୆сྶؓຓ֥҆٠໙ࡆഈభሗ_G.đ֌൞٠໙෎؇۷ॹđၹູᆃ҂ടࠣ֞ metamethodbა࠿ӵ҂๝֥൞ᆃᇕٚمđ൐֤୆ॖၛ٠໙঺֥ߌ࣢Ġᆃᇕٚم֥ݺაߊ ൞Ⴕᆚၰ֥đ֌൞Ⴕൈީ୆ॖିླေᆃᇕਲࠃྟb ၂۱۷ࡆᆞ֥ܿٚم൞ğᆺϜ୆ླေ֥ݦඔࠇᆀ packages ലૼູ localğ local P = {} pack = P -- Import Section: -- declare everything this package needs from outside
  118. Programming in Lua 115 Copyright ® 2005, Translation Team, www.luachina.net

    local sqrt = math.sqrt local io = io -- no more external access after this point setfenv(1, P) ᆃ၂࠯ඌေ౰഍؟đ֌෰൐୆֥ package ֥׿৫ྟбࢠݺb෰֥෎؇္бభ૫ପࠫ ᇕٚمॹb 1 15 5. .5 5 ః ః෰ ෰၂ ၂ུ ུ࠯ ࠯ె ెč čO Ot th he er r F Fa ac ci il li it ti ie es sĎ Ď ᆞೂభ૫໡෮ඪ֥đႨіটൌགྷ packages ݖӱᇏॖၛ൐Ⴈ Lua ֥෮Ⴕ఼ն֥ۿିb ᆃ৚૫Ⴕ໭ཋ֥ॖିྟbᄝᆃ৚đ໡ᆺ۳ԛ၂ུࡹၰb ໡ૌ҂ླေࡼ package ֥෮Ⴕ܄ႵӮჴ֥קၬ٢ᄝ၂ఏđ২ೂđ໡ૌॖၛᄝ၂۱׿ ৫ٳष֥ chunk ᇏ۳໡ૌ֥گඔ package ᄹࡆ၂۱ྍ֥ݦඔğ function complex.div (c1, c2) return complex.mul(c1, complex.inv(c2)) end č֌൞ᇿၩğ඲ႵӮჴсྶཋᇅᄝ၂۱໓ࡱᆭଽđ໡ಪູᆃ൞၂ࡱݺ൙Ďّݖটđ ໡ૌॖၛᄝ๝၂۱໓ࡱᆭଽקၬ؟۱ packagesđ໡ૌླေቓ֥ᆺ൞ࡼૄ၂۱ package ٢ ᄝ၂۱ do ս઒ॶଽđᆃဢ local эਈҌିФཋᇅᄝପ۱ս઒ॶᇏb ᄝ package ຓ҆đೂݔ໡ૌླေࣜӈ൐Ⴈଖ۱ݦඔđ໡ૌॖၛ۳෰ૌקၬ၂۱अ҆ эਈ଀ğ local add, i = complex.add, complex.i c1 = add(complex.new(10, 20), i) ೂݔ໡ૌ҂མ၂ђႻ၂ђ֥ᇗཿpackage଀đ ໡ૌႨ၂۱؋֥अ҆эਈіൕpackageğ local C = complex c1 = C.add(C.new(10, 20), C.i) ཿ၂۱ݦඔҷष package ္൞ޓಸၞ֥đࡼ package ᇏ෮Ⴕ֥଀ሳ٢֞ಆअଁ଀ॢ ࡗࠧॖğ function openpackage (ns) for n,v in pairs(ns) do _G[n] = v end end openpackage(complex) c1 = mul(new(10, 20), i)
  119. Programming in Lua 116 Copyright ® 2005, Translation Team, www.luachina.net

    ೂݔ୆քྏյष package ֥ൈީ߶Ⴕଁ଀Ԋ๬đॖၛᄝڮᆴၛభ࡟Ұ၂༯଀ሳ൞ڎ թᄝğ function openpackage (ns) for n,v in pairs(ns) do if _G[n] ~= nil then error("name clash: " .. n .. " is already defined") end _G[n] = v end end ႮႿ packages Чദ္൞іđ໡ૌമᇀॖၛᄝ packages ᇏళส packagesĠ္ࣼ൞ඪ໡ ૌᄝ၂۱ package ଽߎॖၛԷࡹ packageđಖުޓഒႵсေᆃહቓb ਸ਼၂۱Ⴕ౿ᆭԩ൞ሱ׮ࡆᄛğݦඔᆺႵФൌ࠽൐Ⴈ֥ൈީҌ߶ሱ׮ࡆᄛb֒໡ૌࡆ ᄛ၂۱ሱ׮ࡆᄛ֥ packageđ߶ሱ׮Էࡹ၂۱ྍ֥ॢіটіൕ package ѩ౏ഡᇂі֥ __index metamethod টປӮሱ׮ࡆᄛb֒໡ૌטႨ಩ޅ၂۱ીႵФࡆᄛ֥ݦඔ֥ൈީđ __index metamethod ࡼФԨؿಀࡆᄛሢ۱ݦඔb֒טႨؿགྷݦඔၘࣜФࡆᄛđ__index ࡼ ҂߶ФԨؿb ༯૫Ⴕ၂۱ࡥֆ֥ൌགྷሱ׮ࡆᄛ֥ٚمbૄ၂۱ݦඔקၬᄝ၂۱ڣᇹ໓ࡱᇏb(္ॖ ି၂۱໓ࡱଽႵ؟۱ݦඔ)ᆃུ໓ࡱᇏ֥ૄ၂۱׻ၛѓሙ֥ٚൔקၬݦඔđ২ೂğ function pack1.foo () ... end function pack1.goo () ... end ಖطđ໓ࡱѩ҂߶Էࡹ packageđၹູ֒ݦඔФࡆᄛ֥ൈީ package ၘࣜթᄝਔb ᄝᇶ package ᇏ໡ૌקၬ၂۱ڣᇹіট࠺੣ݦඔթ٢໊֥ᇂğ local location = { foo = "/usr/local/lua/lib/pack1_1.lua", goo = "/usr/local/lua/lib/pack1_1.lua", foo1 = "/usr/local/lua/lib/pack1_2.lua", goo1 = "/usr/local/lua/lib/pack1_3.lua", } ༯૫໡ૌԷࡹ package ѩ౏קၬෲ֥ metamethodğ pack1 = {}
  120. Programming in Lua 117 Copyright ® 2005, Translation Team, www.luachina.net

    setmetatable(pack1, {__index = function (t, funcname) local file = location[funcname] if not file then error("package pack1 does not define " .. funcname) end assert(loadfile(file))() -- load and run definition return t[funcname] -- return the function end}) return pack1 ࡆᄛᆃ۱ package ᆭުđֻ၂Ցӱ྽ᆳྛ pack1.foo()ࡼԨؿ__index metamethodđࢤ ሢؿགྷݦඔႵ၂۱ཌྷႋ֥໓ࡱđѩࡆᄛᆃ۱໓ࡱbັ૳ᆭԩᄝႿğࡆᄛਔ໓ࡱđ๝ൈْ ߭ݦඔቔູ٠໙֥ࢲݔb ၹູᆜ۱༢๤čၲᆀğᆃ৚ॖିᆷگඔϔĤĎ׻൐Ⴈ Lua ཿ֥đ෮ၛޓಸၞڿэ༢ ๤֥ྛູb২ೂđݦඔॖၛ൞Ⴈ C ཿ֥đᄝ metamethod ᇏႨ loadlib ࡆᄛ෰bࠇᆀ໡ૌ ໡ૌॖၛᄝಆअіᇏഡק၂۱ metamethod টሱ׮ࡆᄛᆜ۱ packages.ᆃ৚Ⴕ໭ཋ֥ॖି ֩ሢ୆ಀؿडb
  121. Programming in Lua 118 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 16 ᅣ ૫ཟؓའӱ྽ഡ࠹ Lua ᇏ֥і҂ࣇᄝଖᇕၩၬഈ൞၂ᇕؓའbཞؓའ၂ဢđі္Ⴕሑ෿čӮჴэਈĎ Ġ ္Ⴕაؓའ֥ᆴ׿৫֥Чྟđหљ൞ႚႵਆ۱҂๝ᆴ֥ؓའčtableĎսіਆ۱҂๝֥ؓ འĠ၂۱ؓའᄝ҂๝֥ൈީ္ॖၛႵ҂๝֥ᆴđ֌෰൓ᇔ൞၂۱ؓའĠაؓའোරđі ֥ളଁᇛ௹აఃႮ൉હԷࡹaᄝଧԷࡹીႵܱ༢bؓའႵ෰ૌ֥Ӯჴݦඔđі္Ⴕğ Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end ᆃ۱קၬԷࡹਔ၂۱ྍ֥ݦඔđѩ౏Ќթᄝ Account ؓའ֥ withdraw თଽđ༯૫໡ ૌॖၛᆃဢטႨğ Account.withdraw(100.00) ᆃᇕݦඔࣼ൞໡ૌ෮໌֥ٚمđಖطđᄝ၂۱ݦඔଽ҆൐Ⴈಆअэਈ଀ Account ൞ ၂۱҂ݺ֥༝ܸb൮༵đᆃ۱ݦඔᆺିᄝᆃ۱ห൹֥ؓའčၲᆀğᆷ AccountĎᇏ൐ႨĠ ֻؽđࠧ൐ؓᆃ۱ห൹֥ؓའط࿽đᆃ۱ݦඔ္ᆺႵᄝؓའФթԥᄝห൹֥эਈčၲᆀğ ᆷ AccountĎᇏҌॖၛ൐Ⴈbೂݔ໡ૌڿэਔᆃ۱ؓའ֥଀ሳđݦඔ withdraw ࡼ҂ି۽ ቔğ a = Account; Account = nil a.withdraw(100.00) -- ERROR! ᆃᇕྛູິМਔభ૫֥ؓའႋھႵ׿৫֥ളଁᇛ௹֥ჰᄵb ၂۱ਲࠃ֥ٚم൞ğ קၬٚم֥ൈީջഈ၂۱حຓ֥ҕඔđ টіൕٚمቔႨ֥ؓའb ᆃ۱ҕඔࣜӈູ self ࠇᆀ thisğ function Account.withdraw (self, v) self.balance = self.balance - v end གྷᄝđ֒໡ૌטႨᆃ۱ٚم֥ൈީ҂ླေᆷק෰Ҡቔ֥ؓའਔğ a1 = Account; Account = nil ... a1.withdraw(a1, 100.00) -- OK ൐Ⴈ self ҕඔקၬݦඔުđ໡ૌॖၛࡼᆃ۱ݦඔႨႿ؟۱ؓའഈğ a2 = {balance=0, withdraw = Account.withdraw}
  122. Programming in Lua 119 Copyright ® 2005, Translation Team, www.luachina.net

    ... a2.withdraw(a2, 260.00) self ҕඔ֥൐Ⴈ൞ޓ؟૫ཟؓའე࿽֥ေׄbն؟ඔ OO ე࿽ࡼᆃᇕࠏᇅႅҟఏটđ ᆃဢӱ྽ჴ҂сലૼᆃ۱ҕඔčෙಖಯಖॖၛᄝٚمଽ൐Ⴈᆃ۱ҕඔĎ bLua ္ิ܂ਔ๙ ݖ൐ႨવݼҠቔژটႅҟᆃ۱ҕඔ֥ലૼb໡ૌॖၛᇗཿഈ૫֥ս઒ğ function Account:withdraw (v) self.balance = self.balance - v end טႨٚمೂ༯ğ a:withdraw(100.00) વݼི֥ݔཌྷ֒ႿᄝݦඔקၬބݦඔטႨ֥ൈީđᄹࡆ၂۱حຓ֥ႅҟҕඔbᆃᇕ ٚൔᆺ൞ิ܂ਔ၂ᇕٚь֥ეمđൌ࠽ഈѩીႵ൉હྍ֥ଽಸb໡ૌॖၛ൐Ⴈ dot ეم קၬݦඔطႨવݼეمטႨݦඔđّᆭၧಖđᆺေ໡ૌᆞಒ֥ԩ৘ݺحຓ֥ҕඔğ Account = { balance=0, withdraw = function (self, v) self.balance = self.balance - v end } function Account:deposit (v) self.balance = self.balance + v end Account.deposit(Account, 200.00) Account:withdraw(100.00) གྷᄝ໡ૌ֥ؓའႚႵ၂۱ѓൕژđ၂۱ሑ෿ބҠቔᆃ۱ሑ෿֥ٚمb֌෰ૌ၇ಖಌ ഒ၂۱ class ༢๤đ࠿ӵބႅҟb༵ࢳथֻ၂۱໙ีğ໡ૌೂޅҌିԷࡹႚႵཌྷරྛູ֥ ؟۱ؓའ଻Ĥૼಒֹඪđ໡ૌᄸဢҌିԷࡹ؟۱ accountsĤčၲᆀğᆌؓഈ૫֥ؓའ Account ط࿽Ď 1 16 6. .1 1 ো ো ၂ུ૫ཟؓའ֥ე࿽ᇏิ܂ਔো֥ۀ୑đቔູԷࡹؓའ֥ଆϰbᄝᆃུე࿽৚đؓ འ൞ো֥ൌ২bLua ҂թᄝো֥ۀ୑đૄ۱ؓའקၬ෰ሱ֥࠭ྛູѩႚႵሱ֥࠭ྙሑ čshapeĎ bಖطđ၇ऌࠎႿჰ྘čprototypeĎ֥ე࿽бೂ Self ބ NewtonScriptđᄝ Lua
  123. Programming in Lua 120 Copyright ® 2005, Translation Team, www.luachina.net

    ᇏིٟো֥ۀ୑ѩ҂଴b ᄝᆃུე࿽ᇏđ ؓའીႵোb ཌྷّđ ૄ۱ؓའ׻Ⴕ၂۱ prototype čჰ྘Ď đ֒טႨ҂උႿؓའ֥ଖུҠቔൈđ߶ቋ༵߶֞ prototype ᇏҰᅳᆃུҠቔbᄝ ᆃোე࿽ᇏൌགྷোčclassĎ֥ࠏᇅđ໡ૌԷࡹ၂۱ؓའđቔູః෱ؓའ֥ჰ྘ࠧॖčჰ ྘ؓའູোđః෱ؓའູো֥ instanceĎ bোა prototype ֥۽ቔࠏᇅཌྷ๝đ׻൞קၬਔห קؓའ֥ྛູb ᄝ Lua ᇏđ൐Ⴈభ૫ᅣࢫ໡ૌࢺകݖ֥࠿ӵ֥නམđޓಸၞൌགྷ prototypes.۷ૼಒ ֥টඪđೂݔ໡ૌႵਆ۱ؓའ a ބ bđ໡ૌམಞ b ቔູ a ֥ prototype ᆺླေğ setmetatable(a, {__index = b}) ᆃဢđؓའ a טႨ಩ޅ҂թᄝ֥Ӯჴ׻߶֞ؓའ b ᇏҰᅳbඌეഈđॖၛࡼ b ुቔ োđa ुቔؓའb߭֞భ૫ၿྛᅬݼ֥২ሰഈbູਔ൐֤ྍԷࡹ֥ؓའႚႵބ Account ཌྷර֥ྛູđ໡ૌ൐Ⴈ__index metamethodđ൐ྍ֥ؓའ࠿ӵ Accountbᇿၩ၂۱ཬ֥Ⴊ ߄ğ໡ૌ҂ླေԷࡹ၂۱حຓ֥іቔູ account ؓའ֥ metatableĠ໡ૌॖၛႨ Account іЧദቔູ metatableğ function Account:new (o) o = o or {} -- create object if user does not provide one setmetatable(o, self) self.__index = self return o end č֒໡ૌטႨ Account:new ൈđself ֩Ⴟ AccountĠၹՎ໡ૌॖၛᆰࢤ൐Ⴈ Account ౼ս selfbಖطđ൐Ⴈ self ᄝ໡ૌ༯၂ࢫࢺകো࠿ӵൈ۷ކൡĎ bႵਔᆃ؍ս઒ᆭުđ֒ ໡ૌԷࡹ၂۱ྍ֥ᅬݼѩ౏וႨ၂۱ٚم֥ൈީđႵ൉હؿള଻Ĥ a = Account:new{balance = 0} a:deposit(100.00) ֒໡ૌԷࡹᆃ۱ྍ֥ᅬݼ a ֥ൈީđa ࡼ Account ቔູ෰֥ metatablečטႨ Account:new ൈđself ࠧ AccountĎ b֒໡ૌטႨ a:deposit(100.00)đ໡ૌൌ࠽ഈטႨ֥൞ a.deposit(a,100.00)čવݼࣇࣇ൞ეمഈ֥ь০Ď bಖطđLua ᄝі a ᇏᅳ҂֞ depositđၹ Վ෰߭֞ metatable ֥__index ؓႋ֥іᇏҰᅳđ౦ঃնᇁೂ༯ğ getmetatable(a).__index.deposit(a, 100.00) a ֥ metatable ൞ Accountđ Account.__index ္൞ Account čၹູ new ݦඔᇏ self.__index = selfĎ b෮ၛ໡ૌॖၛᇗཿഈ૫֥ս઒ູğ Account.deposit(a, 100.00) ္ࣼ൞ඪđLua Ԯ־ a ቔູ self ҕඔטႨჰ൓֥ deposit ݦඔb෮ၛđྍ֥ᅬݼؓའ Ֆ Account ࠿ӵਔ deposit ٚمb൐Ⴈ๝ဢ֥ࠏᇅđॖၛՖ Account ࠿ӵ෮Ⴕ֥თb࠿ӵ ࠏᇅ҂ࣇؓٚمႵིđؓіᇏ෮Ⴕ֥თ׻Ⴕིb෮ၛđ၂۱ো҂ࣇิ܂ٚمđ္ิ܂ਔ
  124. Programming in Lua 121 Copyright ® 2005, Translation Team, www.luachina.net

    ෰֥ൌ২֥Ӯჴ֥ଏಪᆴb ࠺ᇾğ ᄝ໡ૌֻ၂۱ Account קၬᇏđ ໡ૌิ܂ਔӮჴ balance ଏಪᆴູ 0đ෮ၛđೂݔ໡ૌԷࡹ၂۱ྍ֥ᅬݼطીႵิ܂ balance ֥Ԛ൓ᆴđ෰ࡼ࠿ӵ ଏಪᆴğ b = Account:new() print(b.balance) --> 0 ֒໡ૌטႨ b ֥ deposit ٚمൈđൌ࠽֩ࡎႿğ b.balance = b.balance + v čၹູ self ࣼ൞ bĎ bіղൔ b.balance ֩Ⴟ 0 ѩ౏Ԛ൓֥թॻčb.balanceĎФڮჍ b.balanceb༯၂Ց໡ૌ٠໙ᆃ۱ᆴ֥ൈީđ҂߶ᄝടࠣ֞ index metamethodđၹູ b ၘࣜ թᄝ෰ሱ֥࠭ balance თb 1 16 6. .2 2 ࠿ ࠿ӵ ӵ ๙ӈ૫ཟؓའე࿽ᇏđ࠿ӵ൐֤োॖၛ٠໙ః෰ো֥ٚمđᆃᄝ Lua ᇏ္ޓಸၞགྷ ൌğ ࡌק໡ૌႵ၂۱ࠎো Accountğ Account = {balance = 0} function Account:new (o) o = o or {} setmetatable(o, self) self.__index = self return o end function Account:deposit (v) self.balance = self.balance + v end function Account:withdraw (v) if v > self.balance then error"insufficient funds" end self.balance = self.balance - v end ໡ૌյෘՖࠎোஊളԛ၂۱ሰো SpecialAccountđᆃ۱ሰোᄍྸग़޼౼ॻӑݖ෱֥ թॻჅحཋᇅđ໡ૌՖ၂۱ॢোष൓đՖࠎো࠿ӵ෮ႵҠቔğ SpecialAccount = Account:new()
  125. Programming in Lua 122 Copyright ® 2005, Translation Team, www.luachina.net

    ֞གྷᄝູᆸđSpecialAccount ࣇࣇ൞ Account ֥၂۱ൌ২bགྷᄝఅ૳֥൙౦ؿളਔğ s = SpecialAccount:new{limit=1000.00} SpecialAccount Ֆ Account ࠿ӵਔ new ٚمđ֒ new ᆳྛ֥ൈީđself ҕඔᆷཟ SpecialAccountb෮ၛđs ֥ metatable ൞ SpecialAccountđ__index ္൞ SpecialAccountb ᆃဢđs ࠿ӵਔ SpecialAccountđުᆀ࠿ӵਔ Accountb֒໡ૌᆳྛğ s:deposit(100.00) Lua ᄝ s ᇏᅳ҂֞ deposit თđ෰߶֞ SpecialAccount ᇏҰᅳđᄝ SpecialAccount ᇏ ᅳ҂֞đ߶֞ Account ᇏҰᅳb൐֤ SpecialAccount ห൹ᆭԩᄝႿđ෱ॖၛᇗקၬՖڳ োᇏ࠿ӵট֥ٚمğ function SpecialAccount:withdraw (v) if v - self.balance >= self:getLimit() then error"insufficient funds" end self.balance = self.balance - v end function SpecialAccount:getLimit () return self.limit or 0 end གྷᄝđ֒໡ૌטႨٚم s:withdraw(200.00)đLua ҂߶֞ Account ᇏҰᅳđၹູ෱ֻ ၂Ցࣷᄝ SpecialAccount ᇏؿགྷਔྍ֥ withdraw ٚمđႮႿ s.limit ֩Ⴟ 1000.00č࠺ᇾ ໡ૌԷࡹ s ֥ൈީԚ൓߄ਔᆃ۱ᆴĎӱ྽ᆳྛਔ౼ॻҠቔđs ֥ balance эӮਔڵᆴb ᄝ Lua ᇏ૫ཟؓའႵ౿֥၂۱ٚ૫൞୆҂ླေԷࡹ၂۱ྍোಀᆷק၂۱ྍ֥ྛູb ೂݔࣇࣇ၂۱ؓའླေห൹֥ྛູđ୆ॖၛᆰࢤᄝؓའᇏൌགྷđ২ೂđೂݔᅬݼ s іൕ ၂ུห൹֥ग़޼ğ౼ॻཋᇅ൞෰֥թॻ֥ 10%đ୆ᆺླေྩڿᆃ۱ֆ׿֥ᅬݼğ function s:getLimit () return self.balance * 0.10 end ᆃဢലૼᆭުđטႨ s:withdraw(200.00)ࡼᄎྛ SpecialAccount ֥ withdraw ٚمđ֌ ൞֒ٚمטႨ self:getLimit ൈđቋު֥קၬФԨؿb 1 16 6. .3 3 ؟ ؟ᇗ ᇗ࠿ ࠿ӵ ӵ ႮႿ Lua ᇏ֥ؓའ҂൞ჭള(primitive)֥đ ෮ၛᄝ Lua ᇏႵޓ؟ٚمॖၛൌགྷ૫ཟؓ འ֥ӱ྽ഡ࠹b໡ૌభ૫෮࡮֥֞൐Ⴈ index metamethod ֥ٚمॖି൞ࡥࢱaྟିaਲ ࠃ۲ٚ૫ሸކቋݺ֥b ಖطđ ᆌؓ၂ུห൹౦ঃ္Ⴕ۷ൡކ֥ൌགྷٚൔb ༯૫໡ૌᄝ Lua
  126. Programming in Lua 123 Copyright ® 2005, Translation Team, www.luachina.net

    ᇏ؟ᇗ࠿ӵ֥ൌགྷb ൌགྷ֥ܱ࡯ᄝႿğ ࡼݦඔႨቔ__indexb ࠺ᇾđ ֒၂۱і֥ metatable թᄝ၂۱__index ݦඔൈđ ೂݔ Lua טႨ၂۱ჰ൓іᇏ҂թᄝ֥ݦඔđ Lua ࡼטႨᆃ۱__index ᆷק֥ݦඔb ᆃဢॖၛႨ__index ൌགྷᄝ؟۱ڳোᇏҰᅳሰো҂թᄝ֥თb ؟ᇗ࠿ӵၩ໅ሢ၂۱োႚႵ؟۱ڳোđ෮ၛđ໡ૌ҂ିႨԷࡹ၂۱ো֥ٚمಀԷࡹ ሰোb౼طսᆭ֥൞đ໡ૌקၬ၂۱ห൹֥ݦඔ createClass টປӮᆃ۱ۿିđࡼФԷࡹ ֥ྍো֥ڳোቔູᆃ۱ݦඔ֥ҕඔbᆃ۱ݦඔԷࡹ၂۱іটіൕྍোđѩ౏ࡼ෱֥ metatable ഡקູ၂۱ॖၛൌགྷ؟࠿ӵ֥__index metamethodb࣐ܵ൞؟ᇗ࠿ӵđૄ၂۱ ൌ২၇ಖඋႿ၂۱ᄝఃᇏିᅳ֤֞෱ླေ֥ٚم֥ֆ׿֥োb෮ၛđᆃᇕোބڳোᆭࡗ ֥ܱ༢აԮ๤֥োაൌ২֥ܱ༢൞Ⴕ౵љ֥bหљ൞đ၂۱ো҂ି๝ൈ൞ఃൌ২֥ metatable Ⴛ൞ሱ֥࠭ metatablebᄝ༯૫֥ൌགྷᇏđ໡ૌࡼ၂۱োቔູ෰֥ൌ২֥ metatableđԷࡹਸ਼၂۱іቔູো֥ metatableğ -- look up for `k' in list of tables 'plist' local function search (k, plist) for i=1, table.getn(plist) do local v = plist[i][k] -- try 'i'-th superclass if v then return v end end end function createClass (...) local c = {} -- new class -- class will search for each method in the list of its -- parents (`arg' is the list of parents) setmetatable(c, {__index = function (t, k) return search(k, arg) end}) -- prepare `c' to be the metatable of its instances c.__index = c -- define a new constructor for this new class function c:new (o) o = o or {} setmetatable(o, c) return o
  127. Programming in Lua 124 Copyright ® 2005, Translation Team, www.luachina.net

    end -- return new class return c end ಞ໡ૌႨ၂۱ཬ২ሰӂૼ၂༯ createClass ֥൐Ⴈđࡌק໡ૌభ૫֥ো Account ބਸ਼ ၂۱ো NamedđNamed ᆺႵਆ۱ٚم setname and getnameğ Named = {} function Named:getname () return self.name end function Named:setname (n) self.name = n end ູਔԷࡹ၂۱࠿ӵႿᆃਆ۱ো֥ྍোđ໡ૌטႨ createClassğ NamedAccount = createClass(Account, Named) ູਔԷࡹބ൐Ⴈൌ২đ໡ૌཞ๙ӈ၂ဢğ account = NamedAccount:new{name = "Paul"} print(account:getname()) --> Paul གྷᄝ໡ૌुुഈ૫ቋު၂ओؿളਔ൉હđLua ᄝ account ᇏᅳ҂֞ getnameđၹՎ෰ Ұᅳ account ֥ metatable ֥__indexđࠧ NamedAccountb֌൞đNamedAccount ္ીႵ getnameđၹՎ Lua Ұᅳ NamedAccount ֥ metatable ֥__indexđၹູᆃ۱თЇݣ၂۱ݦ ඔđLua טႨᆃ۱ݦඔѩ൮༵֞ Account ᇏҰᅳ getnameđીႵᅳ֞đಖު֞ Named ᇏ Ұᅳđᅳ֞ѩْ߭ቋᇔ֥ࢲݔb֒ಖđႮႿෆ෬֥گᄖྟđ؟ᇗ࠿ӵི֥ੱбఏֆ࠿ӵ ေ֮b၂۱ࡥֆ֥ڿ೿ྟି֥ٚم൞ࡼ࠿ӵٚمॊН֞ሰোb൐Ⴈᆃᇕ࠯ඌđindex ٚم ೂ༯ğ ... setmetatable(c, {__index = function (t, k) local v = search(k, arg) t[k] = v -- save for next access return v end}) ...
  128. Programming in Lua 125 Copyright ® 2005, Translation Team, www.luachina.net

    ႋႨᆃ۱࠯ెđ٠໙࠿ӵ֥ٚمބ٠໙अ҆ٚم၂ဢॹčหљ൞ֻ၂Ց٠໙Ď bಌׄ ൞༢๤ᄎྛᆭުđޓ଴ڿэٚم֥קၬđၹູᆃᇕڿэ҂ି႕ཙ࠿ӵ৽֥༯؊b 1 16 6. .4 4 ඲ ඲Ⴕ Ⴕྟ ྟč čp pr ri iv va ac cy yĎ Ď ޓ؟ದಪູ඲Ⴕྟ൞૫ཟؓའე࿽֥ႋႵ֥၂҆ٳbૄ۱ؓའ֥ሑ෿ႋھ൞ᆃ۱ؓ འሱ֥࠭൙౦bᄝ၂ུ૫ཟؓའ֥ე࿽ᇏđбೂ C++ބ Java ୆ॖၛ॥ᇅؓའӮჴэਈࠇ ᆀӮჴٚم൞ڎ඲Ⴕbః෰၂ུე࿽бೂ Smalltalk ᇏđ෮Ⴕ֥Ӯჴэਈ׻൞඲Ⴕđ෮Ⴕ ֥Ӯჴٚم׻൞܄Ⴕ֥bֻ၂۱૫ཟؓའე࿽ Simula ҂ิ܂಩ޅЌ޹Ӯჴࠏᇅb ೂభ૫໡ૌ෮ु֥֞ Lua ᇏ֥ᇶေؓའഡ࠹҂ิ܂඲Ⴕྟ٠໙ࠏᇅb҆ٳჰၹၹູ ᆃ൞໡ૌ൐Ⴈ๙Ⴈඔऌࢲܒ tables টіൕؓའ֥ࢲݔb֌൞ᆃ္ّ႘ਔުট֥ Lua ֥ഡ ࠹නམbLua ીႵյෘФႨটࣉྛն྘֥ӱ྽ഡ࠹đཌྷّđLua ଢѓקႿཬ྘֞ᇏ྘֥ ӱ྽ഡ࠹đ๙ӈ൞ቔູն྘༢๤֥၂҆ٳbׅ྘֥đФ၂۱ࠇᆀޓഒࠫ۱ӱ྽ჴषؿđ മᇀФ٤ӱ྽ჴ൐Ⴈb෮ၛđLua х૧෾಺Ⴥބ෾؟֥ದູཋᇅbೂݔ୆҂མ٠໙၂۱ ؓའଽ֥၂ུת༆ࣼ҂ေ٠໙čIf you do not want to access something inside an object, just do not do it.Ď b ಖطđLua ֥ਸ਼၂۱ଢѓ൞ਲࠃྟđิ܂ӱ྽ჴჭࠏᇅčmeta-mechanismsĎ đ๙ݖ ෰୆ॖၛൌགྷޓ؟҂๝֥ࠏᇅbෙಖ Lua ᇏࠎЧ֥૫ཟؓའഡ࠹ѩ҂ิ܂඲Ⴕྟ٠໙֥ ࠏᇅđ໡ૌॖၛႨ҂๝֥ٚൔটൌགྷ෰bෙಖᆃᇕൌགྷѩ҂ӈႨđ֌ᆩ֡෰္൞Ⴕၭ֥đ ҂ࣇၹູ෱ᅚൕਔ Lua ֥၂ུႵ౿֥࢘ઋđ ္ၹູ෱ॖି൞ଖུ໙ี֥ޓݺֹࢳथٚσb ഡ࠹֥ࠎЧනམ൞đૄ۱ؓའႨਆ۱іটіൕğ၂۱૭ඍሑ෿Ġਸ਼၂۱૭ඍҠቔčࠇᆀ ࢡࢤ१Ď bؓའЧദ๙ݖֻؽ۱іট٠໙đ္ࣼ൞ඪđ๙ݖࢤ१ট٠໙ؓའbູਔх૧ໃ ൱ಃ֥٠໙đіൕሑ෿֥іᇏ҂ടࠣ֞ҠቔĠіൕҠቔ֥і္҂ടࠣ֞ሑ෿đ౼طսᆭ ֥൞đሑ෿ФЌթᄝٚم֥оЇଽb২ೂđႨᆃᇕഡ࠹іඍ໡ૌ֥ၿྛᅬݼđ໡ૌ൐Ⴈ ༯૫֥ݦඔ۽ӌԷࡹྍ֥ؓའğ function newAccount (initialBalance) local self = {balance = initialBalance} local withdraw = function (v) self.balance = self.balance - v end local deposit = function (v) self.balance = self.balance + v end local getBalance = function () return self.balance end return {
  129. Programming in Lua 126 Copyright ® 2005, Translation Team, www.luachina.net

    withdraw = withdraw, deposit = deposit, getBalance = getBalance } end ൮༵đݦඔԷࡹ၂۱іႨট૭ඍؓའ֥ଽ҆ሑ෿đѩЌթᄝअ҆эਈ self ଽbಖުđ ݦඔູؓའ֥ૄ၂۱ٚمԷࡹоЇč္ࣼ൞ඪđళส֥ݦඔൌ২Ď bቋުđݦඔԷࡹѩْ ߭ຓ҆ؓའđຓ҆ؓའᇏࡼअ҆ٚم଀ᆷཟቋᇔေൌགྷ֥ٚمbᆃظ֥ܱ࡯ׄᄝႿğᆃ ུٚمીႵ൐Ⴈحຓ֥ҕඔ selfđսู֥൞ᆰࢤ٠໙ selfbၹູીႵᆃ۱حຓ֥ҕඔđ໡ ૌ҂ି൐Ⴈવݼეمট٠໙ᆃུؓའbݦඔᆺିཞః෰ݦඔ၂ဢטႨğ acc1 = newAccount(100.00) acc1.withdraw(40.00) print(acc1.getBalance()) --> 60 ᆃᇕഡ࠹ൌགྷਔ಩ޅթԥᄝ self іᇏ֥҆ٳ׻൞඲Ⴕ֥đnewAccount ْ߭ᆭުđી Ⴕ൉હٚمॖၛᆰࢤ٠໙ؓའđ໡ૌᆺି๙ݖ newAccount ᇏקၬ֥ݦඔট٠໙෰bෙ ಖ໡ૌ֥২ሰᇏࣇࣇࡼ၂۱эਈ٢֞඲Ⴕіᇏđ֌൞໡ૌॖၛࡼؓའ֥಩ޅ֥҆ٳ٢֞ ඲Ⴕіᇏb໡ૌ္ॖၛקၬ඲Ⴕٚمđ෰ૌुఏটའ܄Ⴕ֥đ֌໡ૌѩ҂ࡼః٢֞ࢤ१ ᇏb২ೂđ໡ૌ֥ᅬݼॖၛ۳ଖུႨ޼౼ॻཚႵحຓ֥ 10%֥թॻഈཋđ֌൞໡ૌ҂མ Ⴈ޼ᆰࢤ٠໙ᆃᇕ࠹ෘ֥བྷ༥ྐ༏đ໡ૌൌགྷೂ༯ğ function newAccount (initialBalance) local self = { balance = initialBalance, LIM = 10000.00, } local extra = function () if self.balance > self.LIM then return self.balance*0.10 else return 0 end end local getBalance = function () return self.balance + self.extra() end ...
  130. Programming in Lua 127 Copyright ® 2005, Translation Team, www.luachina.net

    ᆃဢđؓႿႨ޼ط࿽ࣼીႵϷمᆰࢤ٠໙ extra ݦඔਔb 1 16 6. .5 5 S Si in ng gl le e- -M Me et th ho od d ֥ ֥ؓ ؓའ འൌ ൌགྷ གྷٚ ٚم م భ૫֥ OO ӱ྽ഡ࠹֥ٚمႵ၂ᇕห൹౦ঃğؓའᆺႵ၂۱ֆ၂֥ٚمbᆃᇕ౦ঃ ༯đ໡ૌ҂ླေԷࡹ၂۱ࢤ१іđ౼طսᆭ֥൞đ໡ૌࡼᆃ۱ֆ၂֥ٚمቔູؓའْ߭b ᆃ๐ఏটႵུ҂ॖනၰđೂݔླေॖၛگ༝၂༯ 7.1 ࢫđପ৚໡ૌࢺകਔೂޅܒᄯםս ሰݦඔটЌթоЇ֥ሑ෿bఃൌđ၂۱Ќթሑ෿֥םսሰݦඔࣼ൞၂۱ single-method ؓ འb ܱႿ single-method ֥ؓའ၂۱Ⴕ౿֥౦ঃ൞ğ ֒ᆃ۱ single-method ൌ࠽൞၂۱ࠎႿ ᇗေ֥ҕඔطᆳྛ҂๝֥಩ༀ֥ٳஊčdispatchĎٚمൈbᆌؓᆃᇕؓའğ function newObject (value) return function (action, v) if action == "get" then return value elseif action == "set" then value = v else error("invalid action") end end end ൐Ⴈఏটޓࡥֆğ d = newObject(0) print(d("get")) --> 0 d("set", 10) print(d("get")) --> 10 ᆃᇕ٤Ԯ๤֥ؓའൌགྷ൞٤ӈႵི֥đეم d("set",10)ෙಖޓݨ࡮đ֌္ᆺ҂ݖб Ԯ๤֥ d:set(10)Ӊਆ۱ሳژطၘbૄ၂۱ؓའ൞Ⴈ၂۱ֆ׿֥оЇđսࡎбఏіটཬ֥ ؟bᆃᇕٚൔીႵ࠿ӵ֌Ⴕ඲Ⴕྟğ٠໙ؓའሑ෿֥ື၂ٚൔ൞๙ݖ෱֥ଽ҆ٚمb Tcl/Tk ֥Գ१҆ࡱčwidgetsĎ൐Ⴈਔཌྷර֥ٚمđᄝ Tk ᇏ၂۱Գ१҆ࡱ֥଀ሳі ൕ၂۱ᄝԳ१҆ࡱഈᆳྛ۲ᇕॖିҠቔ֥ݦඔča widget commandĎ b
  131. Programming in Lua 128 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 17 ᅣ Weak і Lua ሱ׮ࣉྛଽթ֥ܵ৘bӱ྽ᆺିԷࡹؓའčіđݦඔ֩Ď đطીႵᆳྛ೷Ԣؓའ ֥ݦඔb๙ݖ൐Ⴈগࠍ൬ࠢ࠯ඌđLua ߶ሱ׮೷Ԣପུാི֥ؓའbᆃॖၛ൐୆Ֆଽթ ܵ৘֥ڵքᇏࢳຂԛটb۷ᇗေ֥đॖၛಞ୆ՖପུႮՎႄؿ֥ն҆ٳ BUG ᇏࢳຂԛ টđбೂᆷᆌܫఏčdangling pointersĎބଽթၮԛb ބః෰֥҂๝đLua ֥গࠍ൬ࠢఖ҂թᄝ࿖ߌ֥໙ีbᄝ൐Ⴈ࿖ߌྟ֥ඔऌࢲܒ֥ ൈީđ୆໭ྶࡆೆห൹֥ҠቔĠ෰ૌ߶ཞః෰ඔऌ၂ဢФ൬ࠢb֒ಖđႵུൈީࠧ൐۷ ᇆି߄֥൬ࠢఖ္ླေ୆֥ϺᇹbીႵ಩ޅ֥গࠍ൬ࠢఖॖၛಞ୆ޭ੻וଽթܵ৘֥෮ Ⴕ໙ีb গࠍ൬ࠢఖᆺିᄝಒಪؓའാིᆭުҌ߶ࣉྛ൬ࠢĠ෱൞҂߶ᆩ֡୆ؓগࠍ֥קၬ ֥b၂۱ׅ྘֥২ሰࣼ൞ؐᅜğႵ၂۱ඔቆބᆷཟᅜפ֥෬ႄܒӮb୆ᆩ֡ᆃ۱ඔቆᇏ Ⴕི֥ᆺ൞ᄝפ؊֥ପ၂҆ٳđ֌ Lua ҂ପહಪູbೂݔ୆๙ݖࡥֆ֥ԛᅜҠቔิ౼၂ ۱ඔቆჭ෍đପહඔቆؓའ֥ః෰҆ٳؓ Lua টඪಯಖ൞Ⴕི֥b๝ဢ֥đ಩ޅᄝಆअ эਈᇏലૼ֥ؓའđ׻҂൞ Lua ಪູ֥গࠍđࠧ൐୆֥ӱ྽ᇏ۴ЧીႵႨ֞෰ૌbᆃਆ ᇕ౦ঃ༯đ୆ႋ֒ሱ࠭ԩ৘෱č୆֥ӱ྽Ď đູᆃᇕؓའڮ nil ᆴđٝᆸ෰ૌ෭ᇾః෰֥ ॢ༽ؓའb ಖطđࡥֆ֥ౢ৘୆֥ലૼѩ҂ሹ൞ቀܔ֥bႵུეओླေ୆ބ൬ࠢఖࣉྛحຓ֥ ކቔb၂۱ׅ྘֥২ሰؿളᄝ֒୆མᄝ୆֥ӱ྽ᇏؓࠃ׮֥ؓའčбೂ໓ࡱĎࣉྛ൬ࠢ ֥ൈީbପुఏট൞۱ࡥֆ֥಩ༀğ୆ླေቓ֥൞ᄝ൬ࠢఖᇏҬೆૄ၂۱ྍ֥ؓའbಖ طđ၂֊ؓའФҬೆਔ൬ࠢఖđ෱ࣼ҂߶ᄜФ൬ࠢĆࠧ൐ીႵః෰֥ᆷᆌᆷཟ෱đ൬ࠢ ఖ္҂߶ቓ൉હ֥bLua ߶ಪູᆃ۱ႄႨ൞ູਔቅᆸؓའФ߭൬֥đԢ٤୆ۡු Lua ᄸ હቓb Weak і൞၂ᇕႨটۡු Lua ၂۱ႄႨ҂ႋھٝᆸؓའФ߭൬֥ࠏᇅb၂۱ weak ႄ Ⴈ൞ᆷ၂۱҂Ф Lua ಪູ൞গࠍ֥ؓའ֥ႄႨbೂݔ၂۱ؓའ෮Ⴕ֥ႄႨᆷཟ׻൞ weakđؓའࡼФ൬ࠢđطପུ weak ႄႨࡼ߶Ф೷ԢbLua ๙ݖ weak tables টൌགྷ weak ႄႨğ၂۱ weak tables ൞ᆷ෮ႵႄႨ׻൞ weak ֥ tablebᆃၩ໅ሢđೂݔ၂۱ؓའᆺթ ᄝႿ weak tables ᇏđLua ࡼ߶ቋᇔࡼ෱൬ࠢb іႵ keys ބ valuesđطᆃਆᆀ׻ॖିЇݣ಩ޅো྘֥ؓའbᄝ၂Ϯ౦ঃ༯đগࠍ൬ ࠢఖѩ҂߶൬ࠢቔູ keys ބ values උྟ֥ؓའb္ࣼ൞ඪđkeys ބ values ׻උႿ఼ႄ Ⴈđ෰ૌॖၛٝᆸ෰ૌᆷཟ֥ؓའФ߭൬bᄝ၂۱ weak tables ᇏđkeys ބ vaules ္ॖି ൞ weak ֥bପၩ໅ሢᆃ৚թᄝ೘ᇕো྘֥ weak tablesğweak keys ቆӮ֥ tablesĠweak values ቆӮ֥ tablesĠၛࠣՂ weak tables ো྘đ෰ૌ֥ keys ބ values ׻൞ weak ֥bა table Чദ֥ো྘໭ܱđ֒၂۱ keys ࠇᆀ vaule Ф൬ࠢൈđᆜ۱֥ೆ१čentryĎ׻ࡼՖᆃ ۱ table ᇏཨാb
  132. Programming in Lua 129 Copyright ® 2005, Translation Team, www.luachina.net

    і֥ weak ྟႮ෰֥ metatable ֥__mode თটᆷק֥b ᄝᆃ۱თթᄝ֥ൈީđ сྶ൞ ۱ሳژԱğೂݔᆃ۱ሳژԱЇݣཬཿሳଛmkn đᆃ۱ table ᇏ֥ keys ࣼ൞ weak ֥Ġೂݔ ᆃ۱ሳژԱЇݣཬཿሳଛmvn đᆃ۱ table ᇏ֥ vaules ࣼ൞ weak ֥b༯૫൞၂۱২ሰđ ෙಖ൞ದᄯ֥đ֌൞ॖၛӂૼ weak tables ֥ࠎЧႋႨğ a = {} b = {} setmetatable(a, b) b.__mode = \"k\" -- now 'a' has weak keys key = {} -- creates first key a[key] = 1 key = {} -- creates second key a[key] = 2 collectgarbage() -- forces a garbage collection cycle for k, v in pairs(a) do print(v) end --> 2 ᄝᆃ۱২ሰᇏđֻؽ۱ڮᆴეओ key={}ڭۂਔֻ၂۱ key ֥ᆴb֒গࠍ൬ࠢఖ۽ቔ ൈđᄝః෰ֹٚીႵᆷཟֻ၂۱ key ֥ႄႨđ෮ၛ෱Ф൬ࠢਔđၹՎཌྷؓႋ֥ table ᇏ֥ ೆ१္๝ൈФ၍Ԣਔbॖ൞đֻؽ۱ keyđಯಖ൞ᅝႨࠃ׮֥эਈ keyđ෮ၛ෱҂߶Ф൬ ࠢb ေᇿၩđᆺႵؓའҌॖၛՖ၂۱ weak table ᇏФ൬ࠢbбೂඔሳބ҃غᆴো྘֥ᆴđ ׻൞҂߶Ф൬֥ࠢb২ೂđೂݔ໡ૌᄝ table ᇏҬೆਔ၂۱ඔᆴ྘֥ keyčᄝభ૫ପ۱২ ሰᇏĎ đ ෱ࡼႥჹ҂߶Ф൬ࠢఖՖ table ᇏ၍Ԣb ֒ಖđ ೂݔؓႋႿᆃ۱ඔᆴ྘ key ֥ vaule Ф൬ࠢđପહ෱֥ᆜ۱ೆ१ࡼ߶Ֆ weak table ᇏФ၍Ԣb ܱႿሳژԱ֥၂ུ༥ັҵљğՖഈ૫֥ൌགྷটुđ࣐ܵሳژԱ൞ॖၛФ൬֥ࠢđ෰ ૌಯಖ۵ః෰ॖ൬ࠢؓའႵ෮౵љb ః෰ؓའđбೂ tables ބݦඔđ෰ૌ׻൞ཁൕ֥Ф Էࡹbбೂđ҂ܵ൉હൈީ֒ Lua მ֞{}ൈđ෱ࡹ৫ਔ၂۱ྍ֥ tableb಩ޅൈީᆃ۱ functiončĎ b b bend ࡹ৫ਔ၂۱ྍ֥ݦඔčൌ࠽ഈ൞၂۱оЇĎ bಖطđLua ࡮֞oap.. obp֥ൈީ߶Էࡹ၂۱ྍ֥ሳژԱĤೂݔ༢๤ᇏၘࣜႵ၂۱ሳژԱoabp֥߅ᄸહϷĤ Lua ߶ᇗྍࡹ৫၂۱ྍ֥Ĥщၲఖॖၛᄝӱ྽ᄎྛᆭభԷࡹሳژԱહĤᆃ໭ܱࣅေğᆃ ུ൞ൌགྷ֥༥ࢫbၹՎđՖӱ྽ჴ֥࢘؇টुđሳژԱ൞ᆴط҂൞ؓའb෮ၛđࣼཞඔ ᆴࠇ҃غᆴđ၂۱ሳژԱ҂߶Ֆ weak tables ᇏФ၍ԢčԢ٤෱෮ܱ৳֥ vaule Ф൬ࠢĎ b
  133. Programming in Lua 130 Copyright ® 2005, Translation Team, www.luachina.net

    1 17 7. .1 1 ࠺ ࠺ၫ ၫݦ ݦඔ ඔ ၂۱ཌྷ֒௴ђ֥щӱ࠯ඌ൞Ⴈॢࡗটߐ౼ൈࡗb୆ॖၛ๙ݖ࠺ၫݦඔࢲݔটࣉྛႪ ߄đ֒୆Ⴈ๝ဢ֥ҕඔᄜՑטႨݦඔൈđ෱ॖၛሱ׮ْ߭࠺ၫ֥ࢲݔb མཞ၂༯၂۱๙Ⴈ֥ڛༀఖđࢤ൬Їݣ Lua ս઒֥ሳژԱ౨౰bૄ֒෱൬֞၂۱౨ ౰đ෱טႨ loadstring ࡆᄛሳژԱđಖުטႨݦඔࣉྛԩ৘bಖطđloadstring ൞၂۱oऍ նp֥ݦඔđ၂ུଁ਷ᄝڛༀఖᇏ߶௔ֹَ൐Ⴈb҂ླေّگטႨ loadstring ބު૫ࢤሢ ֥ closeconnectiončĎ đڛༀఖॖၛ๙ݖ൐Ⴈ၂۱ڣᇹ table ট࠺ၫ loadstring ֥ࢲݔbᄝ טႨ loadstring ᆭభđڛༀఖ߶ᄝᆃ۱ table ᇏ࿙ᅳᆃ۱ሳژԱ൞ڎၘࣜႵਔيၲݺ֥ࢲ ݔbೂݔીႵᅳ֞đପહčط౏ᆺ൞ᆃ۱౦ঃĎڛༀఖ߶טႨ loadstring ѩϜᆃՑ֥ࢲݔ թೆڣᇹ tableb໡ૌॖၛࡼᆃ۱ҠቔЇልູ၂۱ݦඔğ local results = {} function mem_loadstring (s) if results[s] then -- result available? return results[s] -- reuse it else local res = loadstring(s) -- compute new result results[s] = res -- save for later reuse return res end end ᆃ۱ٚσ֥թԥཨݻॖି൞ऍն֥b࣐ܵೂՎđ෱ಯಖॖି߶֝ᇁၩਘᆭຓ֥ඔऌ ಺Ⴥb ࣐ܵ၂ུଁ਷၂ђђ֥ᇗگᆳྛđ ֌Ⴕུଁ਷ॖିᆺᄎྛ၂Ցb ࡶࡶֹđ ᆃ۱ table ࠒ৆ਔڛༀఖ෮Ⴕଁ਷ФטႨԩ৘ު֥ࢲݔĠᄪພႵ၂฿đ෱߶ࠪЕڛༀఖ֥ଽթb၂ ۱ weak table ิ܂ਔؓႿᆃ۱໙ี֥ࡥֆࢳथٚσb ೂݔᆃ۱ࢲݔіᇏႵ weak ᆴđ ૄՑ ֥গࠍ൬ࠢ࿖ߌ׻߶၍Ԣ֒భൈࡗଽ෮ႵໃФ൐Ⴈ֥ࢲݔč๙ӈ൞ҵ҂؟ಆ҆Ď ğ local results = {} setmetatable(results, {__mode = \"v\"}) -- make values weak function mem_loadstring (s) ... -- as before ൙ൌഈđၹູ table ֥෬ႄ༯ѓࣜӈ൞ሳژԱൔ֥đೂݔ჻ၩđ໡ૌॖၛࡼ table ಆ ҆ᇂ weakğ setmetatable(results, {__mode = \"kv\"}) ቋᇔࢲݔ൞ປಆ၂ဢ֥b ࠺ၫ࠯ඌᄝЌӻ၂ུো྘ؓའ֥ື၂ྟഈ๝ဢႵႨb২ೂđࡌೂ၂۱༢๤ࡼ๙ݖ tables іղ࿾೤đ๙ݖႵ၂קቆކٚൔ֥ޣ೤đੳ೤đড೤b၂۱ሱಖ࿾೤ט೤ఖ๙ݖ
  134. Programming in Lua 131 Copyright ® 2005, Translation Team, www.luachina.net

    ૄ၂Ցྍ֥౨౰Ӂളྍ֥࿾೤ğ function createRGB (r, g, b) return {red = r, green = g, blue = b} end ൐Ⴈ࠺ၫ࠯ඌđ ໡ૌॖၛࡼ๝ဢ֥࿾೤ࢲݔթԥᄝ๝၂۱ table ᇏb ູਔࡹ৫ૄ၂ᇕ ࿾೤ື၂֥ keyđ໡ૌࡥֆ֥൐Ⴈ၂۱ٳۯژ৵ࢤ࿾೤෬ႄ༯ѓğ local results = {} setmetatable(results, {__mode = \"v\"}) -- make values weak function createRGB (r, g, b) local key = r .. \"-\" .. g .. \"-\" .. b if results[key] then return results[key] else local newcolor = {red = r, green = g, blue = b} results[key] = newcolor return newcolor end end ၂۱Ⴕ౿֥ުݔࣼ൞đႨ޼ॖၛ൐Ⴈᆃ۱ჰ൓֥֩ݼᄎෘژбؓҠቔটяљ࿾೤đ ၹູਆ۱๝ൈթᄝ֥࿾೤๙ݖ๝၂۱֥ table টіղb ေᇿၩđ ๝ဢ֥࿾೤ॖିᄝ҂๝֥ ൈࡗ๙ݖ҂๝֥ tales টіղđၹູগࠍ൬ࠢఖ၂ՑՑ֥ᄝౢ৘ࢲݔ tablebಖطđᆺေ ۳ק֥࿾೤ᆞᄝФ൐Ⴈđ෱ࣼ҂߶ՖࢲݔᇏФ၍Ԣb෮ၛđ಩ޅൈީ၂۱࿾೤ᄝ๝ః෰ ࿾೤ࣉྛбࢠ֥ൈީթࠃ֥ܔࣲđ෱֥ࢲݔࣤཞ္๝ဢթࠃb 1 17 7. .2 2 ܱ ܱ৳ ৳ؓ ؓའ འඋ උྟ ྟ weak tables ֥ਸ਼၂۱ᇗေ֥ႋႨࣼ൞ބؓའ֥උྟܱ৳bᄝ၂۱ؓའഈࡆೆ۷؟֥ උྟ൞໭ൈ໭ख़׻߶ؿള֥ğ ݦඔ଀ӫđtables ֥ಌസᆴđඔቆ֥նཬđ֩֩b ֒ؓའ൞і֥ൈީđ໡ૌॖၛ൐Ⴈ၂۱ކൡ֥ື၂ key টࡼඋྟЌթᄝіᇏbࣼཞ ໡ૌᄝభ૫ඪ֥ପဢđ၂۱ޓࡥֆѩ౏ॖၛٝᆸհ༂֥ٚم൞ࡹ৫၂۱ྍ֥ؓའčׅ྘ ֥бೂ tableĎಖުϜ෱֒Ӯ key ൐Ⴈbಖطđೂݔؓའ҂൞ tableđ෱ࣼ҂ିሱ࠭Ќթሱ ദ֥උྟbࠧ൐൞ tablesđႵུൈީ໡ૌॖି္҂མϜඋྟЌթᄝჰট֥ؓའᇏಀb২ ೂđ ໡ૌॖି༐ຬࡼඋྟቔູ඲Ⴕ֥đ ࠇᆀ໡ૌ҂མᄝ٠໙ table ᇏჭ෍֥ൈީ൳֞ᆃ۱ حຓ֥උྟ֥ۄಠbᄝഈඍᆃུ౦ঃ༯đ໡ૌླေ၂۱ูս֥ٚمটࡼඋྟބؓའ৳༢ ఏটb֒ಖđ၂۱ຓ֥҆ table ิ܂ਔ၂ᇕ৘མ߄֥ٚൔট৳༢උྟބؓའčtables Ⴕൈ Фӫቔ৳ކඔቆѩ҂୽ಖĎ b໡ૌϜᆃ۱ؓའ֒ቔ key ট൐Ⴈđ෰ૌ֥උྟቔູ vauleb ၂۱ຓ֥҆ table ॖၛЌթ಩ޅো྘ؓའ֥උྟčࣼཞ Lua ᄍྸ໡ૌࡼ಩ޅؓའुቔ keyĎ bՎຓđЌթᄝ၂۱ຓ҆ table ֥උྟ҂߶ٞθ֞ః෰֥ؓའđѩ౏ॖၛཞᆃ۱ table
  135. Programming in Lua 132 Copyright ® 2005, Translation Team, www.luachina.net

    Чദ၂ဢ඲Ⴕ߄b ಖطđ ᆃ۱ुఏটປૅ֥ࢳथٚσႵ၂۱ऍն֥ಌׄğ ၂֊໡ૌᄝ၂۱ table ᇏࡼ၂ ۱ؓའ൐Ⴈູ keyđ໡ૌࣼࡼᆃ۱ؓའ෭קູႥࣲթᄝbLua ҂ି൬ࠢ၂۱ᆞᄝФ֒ቔ key ൐Ⴈ֥ؓའbೂݔ໡ૌ൐Ⴈ၂۱௴๙֥ table টܱ৳ݦඔބ଀ሳđପહ෮Ⴕ֥ᆃུݦ ඔࡼႥჹ҂߶Ф൬ࠢbᆞೂ୆෮མ֥ପဢđ໡ૌॖၛ๙ݖ൐Ⴈ weak table টࢳथᆃ۱໙ ีbᆃ၂Ցđ໡ૌླေ weak keysb၂֊ીႵః෰ֹ֥ٚႄႨđweak keys ѩ҂߶ቅᆸ಩ ޅ֥ key Ф൬ࠢbՖਸ਼၂ٚ૫ඪđᆃ۱ table ҂߶թᄝ weak vaulesĠڎᄵđࠃ׮ؓའ֥ උྟࣼॖିФ൬ࠢਔb Lua Чദ൐Ⴈᆃᇕ࠯ඌটЌթඔቆ֥նཬbཞ໡ૌ༯૫ࠧࡼु֥֞ପဢđtable ९ิ ܂ਔ၂۱ݦඔটഡקඔቆ֥նཬđਸ਼၂۱ݦඔট؀౼ඔቆ֥նཬb֒୆ഡקਔ၂۱ඔቆ ֥նཬđLua ࡼᆃ۱ԄժЌթᄝ၂۱඲Ⴕ֥ weak tableđ෬ႄࣼ൞ඔቆЧദđط value ࣼ ൞෱֥Ԅժb 1 17 7. .3 3 ᇗ ᇗඍ ඍջ ջႵ Ⴕଏ ଏಪ ಪᆴ ᆴ֥ ֥і і ᄝᅣࢫ 13.4.3đ໡ૌษંਔᄸဢ൐Ⴈ٤ nil ֥ଏಪᆴটൌགྷіb໡ૌิ֞၂ᇕห൹֥ ࠯ඌѩᇿ൤ඪਸ਼ຓਆᇕ࠯ඌླေ൐Ⴈ weak tablesđ ෮ၛ໡ૌ๷Ӿᄝᆃ৚ࢺക෰ૌb གྷᄝđ ࢺകෲૌ֥ൈީਔbࣼཞ໡ૌඪ֥ପဢđᆃਆᇕଏಪᆴ֥࠯ඌൌ࠽ഈটჷႿ໡ૌభ૫ิ ֥֞ਆᇕ๙Ⴈ֥࠯ඌ֥ห൹ႋႨğؓའඋྟބ࠺ၫb ᄝֻ၂ᇕࢳथٚσᇏđ໡ૌ൐Ⴈ weak table টࡼଏಪ vaules ބૄ၂۱ table ཌྷ৳༢ğ local defaults = {} setmetatable(defaults, {__mode = \"k\"}) local mt = {__index = function (t) return defaults[t] end} function setDefault (t, d) defaults[t] = d setmetatable(t, mt) end ೂݔଏಪᆴીႵ weak ֥ keysđ෱ࣼ߶ࡼ෮Ⴕ֥ջႵଏಪᆴ֥ tables ഡקູႥࣲթ ᄝbᄝֻؽᇕٚمᇏđ໡ૌ൐Ⴈ҂๝֥ metatables টЌթ҂๝֥ଏಪᆴđ֌֒໡ૌᇗگ ൐Ⴈ၂۱ଏಪᆴ֥ൈީđ ᇗႨ๝၂۱ཌྷ๝֥ metatableb ᆃ൞၂۱ׅ྘֥࠺ၫ࠯ඌ֥ႋႨğ local metas = {} setmetatable(metas, {__mode = \"v\"}) function setDefault (t, d) local mt = metas[d] if mt == nil then
  136. Programming in Lua 133 Copyright ® 2005, Translation Team, www.luachina.net

    mt = {__index = function () return d end} metas[d] = mt -- memoize end setmetatable(t, mt) end ᆃᇕ౦ঃ༯đ໡ૌ൐Ⴈ weak vaulesđᄍྸࡼ҂߶Ф൐Ⴈ֥ metatables ॖၛФ߭൬b Ϝᆃਆᇕٚم٢ᄝ၂ఏđଧ۱۷ݺĤ๙ӈđ౼थႿऎุ౦ঃb෱ૌ׻Ⴕཌྷර֥گᄖ ྟބཌྷර֥ྟିbֻ၂ᇕٚمླေᄝૄ۱ଏಪᆴ֥ tables ᇏเࡆ၂ུ໓ሳč၂۱ଏಪ֥ ೆ१Ď b ֻؽᇕٚمླေᄝૄ۱҂๝֥ଏಪᆴࡆೆ၂ུ໓ሳ č၂۱ྍ֥іđ ၂۱ྍ֥оЇđ metas ᇏྍᄹೆ१Ď b෮ၛđೂݔ୆֥ӱ྽Ⴕඔత۱ tablesđطᆃུіᆺႵޓഒඔջႵ҂ ๝ଏಪᆴ֥đֻؽᇕٚمཁಖ۷Ⴊྮbਸ਼၂ٚ૫đೂݔᆺႵޓഒ֥ tabels ॖၛ܋ཚཌྷ๝ ֥ଏಪ vaulesđପહ୆ߎ൞Ⴈֻ၂ᇕٚمϔb
  137. Programming in Lua 135 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 18 ᅣ ඔ࿐९ ᄝᆃ၂ᅣᇏč༯૫ܱႿѓሙ९֥ࠫᅣᇏ๝ဢĎ໡֥ᇶေଢ֥҂൞ؓૄ၂۱ݦඔ۳ԛ ປᆜֹඪૼđط൞ۡු୆ѓሙ९ିܔิ܂൉હۿିbູਔିܔౢԣֹඪૼ໙ีđ໡ॖି ߶ޭ੻၂ུཬ֥࿊ཛࠇᆀྛູbᇶေ֥නམ൞ࠗؿ୆֥ݺఅྏđᆃུݺఅᆭԩॖିᄝҕ ॉ൭Ҩᇏᅳ֞ճσb ඔ࿐९Ⴎෘඌݦඔ֥ѓሙࠢކቆӮđбೂ೘࢘ݦඔ९čsin, cos, tan, asin, acos, etc.Ď đ ૢᆷݦඔčexp, log, log10Ď đചೆݦඔčfloor, ceilĎ amaxaminđࡆഈ၂۱эਈ pibඔ࿐ ९္קၬਔ၂۱ૢҠቔژč^Ď b ෮Ⴕ֥೘࢘ݦඔ׻ᄝ޶؇ֆ໊༯۽ቔb čLua4.0 ၛభᄝ؇ඔ༯۽ቔb Ď ୆ॖၛ൐Ⴈ deg ބ rad ݦඔᄝ؇ބ޶؇ᆭࡗሇߐbೂݔ୆མᄝ degree ౦ঃ༯൐Ⴈ೘࢘ݦඔđ୆ॖၛᇗק ၬ೘࢘ݦඔğ local sin, asin, ... = math.sin, math.asin, ... local deg, rad = math.deg, math.rad math.sin = function (x) return sin(rad(x)) end math.asin = function (x) return deg(asin(x)) end ... math.random ႨটӁളເෛࠏඔđႵ೘ᇕטႨٚൔğ ֻ၂ğ҂ջҕඔđࡼӁള [0,1)ٓຶଽ֥ෛࠏඔ. ֻؽğջ၂۱ҕඔ nđࡼӁള 1 <= x <= n ٓຶଽ֥ෛࠏඔ x. ֻ೘ğջਆ۱ҕඔ a ބ b,ࡼӁള a <= x <= b ٓຶଽ֥ෛࠏඔ x. ୆ॖၛ൐Ⴈ randomseed ഡᇂෛࠏඔؿളఖ֥ᇕሰđᆺିࢤ൳၂۱ඔሳҕඔb๙ӈᄝ ӱ྽ष൓ൈđ൐Ⴈܥק֥ᇕሰԚ൓߄ෛࠏඔؿളఖđၩ໅ሢૄՑᄎྛӱ྽đࡼӁളཌྷ๝ ֥ෛࠏඔ྽ਙbູਔט൫ٚьđᆃޓႵݺԩđ֌൞ᄝႳ༤ᇏࣼၩ໅ሢૄՑᄎྛ׻ႚႵཌྷ ๝֥ܱवbࢳथᆃ۱໙ี֥၂۱๙ӈ֥࠯ె൞൐Ⴈ֒భ༢๤ൈࡗቔູᇕሰğ math.randomseed(os.time()) čos.time ݦඔْ߭၂۱іൕ֒భ༢๤ൈࡗ֥ඔሳđ๙ӈ൞ሱྍࡀჭၛট֥၂۱ᆜ ඔb Ď
  138. Programming in Lua 136 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 19 ᅣ Table ९ table ९Ⴎ၂ུҠቔ table ֥ڣᇹݦඔቆӮb ෰֥ᇶေቔႨᆭ၂൞ؓ Lua ᇏ array ֥ն ཬ۳ԛ၂۱ކ৘֥ࢳ൤bਸ਼ຓߎิ܂ਔ၂ུՖ list ᇏҬೆ೷Ԣჭ෍֥ݦඔđၛࠣؓ array ჭ෍ஆ྽ݦඔb 1 19 9. .1 1 ඔ ඔቆ ቆն նཬ ཬ Lua ᇏ໡ૌࣜӈࡌק array ᄝቋު၂۱٤ nil ჭ෍ԩࢲඏbᆃ۱Ԯ๤֥ჿקႵ၂۱р ؊ğ໡ૌ֥ array ᇏ҂ିႚႵ nil ჭ෍bؓն҆ٳႋႨটඪᆃ۱ཋᇅ҂൞൉હ໙ีđбೂ ֒෮Ⴕ֥ array Ⴕܥק֥ো྘֥ൈީb֌Ⴕུൈީ໡ૌ֥ array ླေႚႵ nil ჭ෍đᆃᇕ ౦ঃ༯đ໡ૌླေ၂ᇕٚمটૼಒ֥іૼ array ֥նཬb Table ९קၬਔਆ۱ݦඔҠሺ array ֥նཬğ getnđ ْ߭ array ֥նཬĠ setnđ ഡᇂ array ֥նཬbೂభ૫໡ૌ෮࡮֥֞đᆃਆ۱ٚمބ table ֥၂۱උྟཌྷܱğေહ໡ૌᄝ table ֥၂۱თᇏЌթᆃ۱උྟđေહ໡ૌ൐Ⴈ၂۱׿৫֥čweakĎtable টܱ৳ table ބᆃ۱ උྟbਆᇕٚم۲Ⴕ০рđ෮ၛ table ९൐Ⴈਔᆃਆ۱ٚمb ๙ӈđטႨ table.setn(t, n)൐֤ t ބ n ᄝଽ҆čweakĎtable ܱ৳đטႨ table.getn(t) ࡼ֤֞ଽ҆ table ᇏބ t ܱ৳֥ପ۱ᆴbಖطđೂݔі t Ⴕ၂۱ջႵඔሳᆴ n ֥თđsetn ࡼྩڿᆃ۱ᆴđط getn ْ߭ᆃ۱ᆴbGetn ݦඔߎႵ၂۱࿊ᄴğೂݔ෰҂ି൐Ⴈഈඍٚم ْ߭ array ֥նཬđࣼ߶൐Ⴈჰ൓֥ٚمğђ৥ array ᆰ֞ᅳֻ֞၂۱ nil ჭ෍bၹՎđ ୆ॖၛᄝ array ᇏ၂ᆰ൐Ⴈ table.getn(t)ࠆ֤ᆞಒ֥ࢲݔbु২ሰğ print(table.getn{10,2,4}) --> 3 print(table.getn{10,2,nil}) --> 2 print(table.getn{10,2,nil; n=3}) --> 3 print(table.getn{n=1000}) --> 1000 a = {} print(table.getn(a)) --> 0 table.setn(a, 10000) print(table.getn(a)) --> 10000 a = {n=10} print(table.getn(a)) --> 10 table.setn(a, 10000) print(table.getn(a)) --> 10000
  139. Programming in Lua 137 Copyright ® 2005, Translation Team, www.luachina.net

    ଏಪ֥đsetn ބ getn ൐Ⴈଽ҆іթԥі֥նཬbᆃ൞ቋۄ֥࣪࿊ᄴđၹູ෱҂߶൐ Ⴈحຓ֥ჭ෍໪ಙ arraybಖطđ൐Ⴈ n თ֥ٚم္Ⴕ၂ུႪׄbᄝջႵॖэҕඔ֥ݦඔ ᇕđ Lua ଽނ൐Ⴈᆃᇕٚمഡᇂ arg ඔቆ֥նཬđ ၹູଽނ҂၇ঠႿ९đ ෰҂ି൐Ⴈ setnb ਸ਼ຓ၂۱ݺԩᄝႿğ໡ૌॖၛᄝ array Էࡹ֥ൈީᆰࢤԚ൓߄෰֥նཬđೂ໡ૌᄝഈ૫ ২ሰᇏु֥֞b ൐Ⴈ setn ބ getn Ҡሺ array ֥նཬ൞۱ݺ֥༝ܸđࠧ൐୆ᆩ֡նཬᄝთ n ᇏbtable ९ᇏ֥෮Ⴕݦඔčsortaconcatainsert ֩֩Ď׻቎࿖ᆃ۱༝ܸbൌ࠽ഈđิ܂ setn Ⴈট ڿэთ n ֥ᆴॖିᆺ൞ູਔა֥ࣸ lua ϱЧ࡙ಸđᆃ۱หྟॖିᄝࡼট֥ϱЧᇏڿэđ ູਔνಆఏ࡮đ҂ေࡌק၇ঠႿᆃ۱หྟb౨၂ᆰ൐Ⴈ getn ࠆ౼ඔቆնཬđ൐Ⴈ setn ഡ ᇂඔቆնཬb 1 19 9. .2 2 Ҭ Ҭೆ ೆ/ /೷ ೷Ԣ Ԣ table ९ิ܂ਔՖ၂۱ list ֥಩ၩ໊ᇂҬೆބ೷Ԣჭ෍֥ݦඔb table.insert ݦඔᄝ array ᆷק໊ᇂҬೆ၂۱ჭ෍đѩࡼު૫෮Ⴕః෰֥ჭ෍ު၍bਸ਼ຓđinsert ڿэ array ֥նཬ čusing setnĎ b২ೂđೂݔ a ൞၂۱ඔቆ{10,20,30}đטႨ table.insert(a,1,15)ުđa эູ {15,10,20,30}bࣜӈ൐Ⴈ֥၂۱ห൹౦ঃ൞đ໡ૌ҂ջ໊ᇂҕඔטႨ insertđࡼ߶ᄝ array ቋު໊ᇂҬೆჭ෍č෮ၛ҂ླေჭ෍၍׮Ď b༯૫֥ս઒ᇯྛ׿ೆӱ྽đѩࡼ෮ႵྛЌթ ᄝ၂۱ array ଽğ a = {} for line in io.lines() do table.insert(a, line) end print(table.getn(a)) --> (number of lines read) table.remove ݦඔ೷Ԣඔቆᇏᆷק໊ᇂ֥ჭ෍đ ѩْ߭ᆃ۱ჭ෍đ ෮Ⴕު૫֥ჭ෍భ ၍đѩ౏ඔቆ֥նཬڿэb҂ջ໊ᇂҕඔטႨ֥ൈީđ෰೷Ԣ array ֥ቋު၂۱ჭ෍b ൐Ⴈᆃਆ۱ݦඔđޓಸၞൌགྷᅜaؒਙބච؊ؒਙb໡ૌॖၛԚ൓߄ࢲܒູ a={}b ၂۱ push Ҡቔ֩ࡎႿ table.insert(a,x)Ġ ၂۱ pop Ҡቔ֩ࡎႿ table.remove(a)b ေᄝࢲܒ֥ ਸ਼၂؊ࢲແҬೆჭ෍໡ૌ൐Ⴈ table.insert(a,1,x)Ġ೷Ԣჭ෍Ⴈ table.remove(a,1)bቋުਆ ۱Ҡቔ҂൞หљႵི֥đၹູ෰ૌсྶট߭၍׮ჭ෍bಖطđၹູ table ९ᆃུݦඔ൐Ⴈ C ൌགྷđؓႿཬ֥ඔቆ(ࠫϤ۱ჭ෍)টඪིੱ׻҂߶Ⴕ൉હ໙ีb 1 19 9. .3 3 ஆ ஆ྽ ྽ ਸ਼၂۱ႵႨ֥ݦඔ൞ table.sortb෰Ⴕਆ۱ҕඔğթ٢ჭ෍֥ array ބஆ྽ݦඔbஆ྽ ݦඔႵਆ۱ҕඔѩ౏ೂݔᄝ array ᇏஆ྽ުֻ၂۱ҕඔᄝֻؽ۱ҕඔభ૫đஆ྽ݦඔс ྶْ߭ truebೂݔໃิ܂ஆ྽ݦඔđsort ൐Ⴈଏಪ֥ཬႿҠቔژࣉྛбࢠb
  140. Programming in Lua 138 Copyright ® 2005, Translation Team, www.luachina.net

    ၂۱ӈ࡮֥հ༂൞ఒ๭ؓі֥༯ѓთࣉྛஆ྽bᄝ၂۱іᇏđ෮Ⴕ༯ѓቆӮ၂۱ࠢ ކđ֌൞໭྽֥bೂݔ୆མؓ෰ૌஆ྽đсྶࡼ෰ૌگᇅ֞၂۱ array ಖުؓᆃ۱ array ஆ྽b໡ૌु۱২ሰđࡌקഈ૫֥؀౼ჷ໓ࡱѩԷࡹਔ၂۱іđᆃ۱і۳ԛਔჷ໓ࡱᇏ ૄ၂۱ݦඔФקၬֹ֥֥ٚྛݼğ lines = { luaH_set = 10, luaH_get = 24, luaH_present = 48, } གྷᄝ୆མၛሳଛඨ྽յႆԛᆃུݦඔ଀đ ೂݔ୆൐Ⴈ pairs ђ৥ᆃ۱іđ ݦඔ଀ԛགྷ ֥ඨ྽ࡼ൞ෛࠏ֥bಖطđ୆҂ିᆰࢤஆ྽෰ૌđၹູᆃུ଀ሳ൞і֥ keyb֒୆ࡼᆃ ུݦඔ଀٢֞၂۱ඔቆଽđࣼॖၛؓᆃ۱ඔቆࣉྛஆ྽b൮༵đсྶԷࡹ၂۱ඔቆটЌ թᆃུݦඔ଀đಖުஆ྽෰ૌđቋުյႆԛࢲݔğ a = {} for n in pairs(lines) do table.insert(a, n) end table.sort(a) for i,n in ipairs(a) do print(n) end ᇿၩđؓႿ Lua টඪđඔቆ္൞໭྽֥b֌൞໡ૌᆩ֡ᄸဢಀ࠹ඔđၹՎᆺေ໡ૌ ൐Ⴈஆ྽ݺ֥༯ѓ٠໙ඔቆࣼॖၛ֤֞ஆݺ྽֥ݦඔ଀bᆃࣼ൞ູ൉હ໡ૌ၂ᆰ൐Ⴈ ipairs ط҂൞ pairs ђ৥ඔቆ֥ჰၹbభᆀ൐Ⴈ key ֥ඨ྽ 1a2allđުᆀі֥ሱಖթ ԥඨ྽b Ⴕ၂۱۷ݺ֥ࢳथٚمđ໡ૌॖၛཿ၂۱םսሰট۴ऌ key ᆴђ৥ᆃ۱іb၂۱ॖ ࿊֥ҕඔ f ॖၛᆷקஆ྽֥ٚൔb ൮༵đ ࡼஆ྽֥ keys ٢֞ඔቆଽđ ಖުђ৥ᆃ۱ඔቆđ ૄ၂҄Ֆჰ൓іᇏْ߭ key ބ valueğ function pairsByKeys (t, f) local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f) local i = 0 -- iterator variable local iter = function () -- iterator function i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end
  141. Programming in Lua 139 Copyright ® 2005, Translation Team, www.luachina.net

    Ⴕਔᆃ۱ݦඔđޓಸၞၛሳଛඨ྽յႆᆃུݦඔ଀đ࿖ߌğ for name, line in pairsByKeys(lines) do print(name, line) end յႆࢲݔğ luaH_get 24 luaH_present 48 luaH_set 10
  142. Programming in Lua 140 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 20 ᅣ String ९ Lua ࢳ൤ఖؓሳژԱ֥ᆦӻޓႵཋb၂۱ӱ྽ॖၛԷࡹሳژԱѩ৵ࢤሳژԱđ֌҂ ିࢩ౼ሰԱđ࡟ҰሳژԱ֥նཬđ࡟ҩሳژԱ֥ଽಸbᄝ Lua ᇏҠሺሳژԱ֥ۿିࠎЧ টሱႿ string ९b String ९ᇏ֥၂ུݦඔ൞٤ӈࡥֆ֥ğstring.len(s)ْ߭ሳژԱ s ֥Ӊ؇Ġstring.rep(s, n)ْ߭ᇗگ n ՑሳژԱ s ֥ԱĠ ୆൐Ⴈ string.rep("a", 2^20)ॖၛԷࡹ၂۱ 1M bytes ֥ሳژ Աčбೂđູਔҩ൫ླေĎ Ġstring.lower(s)ࡼ s ᇏ֥նཿሳଛሇߐӮཬཿčstring.upper ࡼཬཿሇߐӮնཿĎ bೂݔ୆མ҂ܱྏնཬཿؓ၂۱ඔቆࣉྛஆ྽֥߅đ୆ॖၛᆃဢğ table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end) string.upper ބ string.lower ׻၇ঠႿЧֹߌ࣢эਈb ෮ၛđ ೂݔ୆ᄝ European Latin-1 ߌ࣢༯đіղൔğ string.upper("a??o") --> "A??O". טႨ string.sub(s,i,j)ݦඔࢩ౼ሳژԱ s ֥Ֆֻ i ۱ሳژֻ֞ j ۱ሳژᆭࡗ֥ԱbLua ᇏđሳژԱֻ֥၂۱ሳژ෬ႄՖ 1 ष൓b୆္ॖၛ൐Ⴈڵ෬ႄđڵ෬ႄՖሳژԱ֥ࢲແ ཟభ࠹ඔğ-1 ᆷཟቋު၂۱ሳژđ-2 ᆷཟ֚ඔֻؽ۱đၛՎো๷b෮ၛđ string.sub(s, 1, j)ْ߭ሳژԱ s ֥Ӊ؇ູ j ֥భሗĠstring.sub(s, j, -1)ْ߭Ֆֻ j ۱ሳژष൓֥ުሗbೂݔ ҂ิ܂ֻ 3 ۱ҕඔđ ଏಪູ-1đ ၹՎ໡ૌࡼቋު၂۱טႨཿູ string.sub(s, j)Ġ string.sub(s, 2, -2)ْ߭ಀԢֻ၂۱ބቋު၂۱ሳژު֥ሰԱb s = "[in brackets]" print(string.sub(s, 2, -2)) --> in brackets ࠺ᇾğLua ᇏ֥ሳژԱ൞ޚק҂э֥bString.sub ݦඔၛࠣ Lua ᇏః෰֥ሳژԱҠቔ ݦඔ׻҂߶ڿэሳژԱ֥ᆴđط൞ْ߭၂۱ྍ֥ሳژԱb၂۱ӈ࡮֥հ༂൞ğ string.sub(s, 2, -2) ಪູഈ૫֥ᆃ۱ݦඔ߶ڿэሳژԱ s ֥ᆴbೂݔ୆མྩڿ၂۱ሳژԱэਈ֥ᆴđ୆ сྶࡼэਈڮ۳၂۱ྍ֥ሳژԱğ s = string.sub(s, 2, -2) string.char ݦඔބ string.byte ݦඔႨটࡼሳژᄝሳژބඔሳᆭࡗሇߐbstring.char ࠆ ౼ 0 ۱ࠇ؟۱ᆜඔđࡼૄ၂۱ඔሳሇߐӮሳژđಖުْ߭၂۱෮Ⴕᆃུሳژ৵ࢤఏট֥ ሳژԱbstring.byte(s, i)ࡼሳژԱ s ֻ֥ i ۱ሳژ֥ሇߐӮᆜඔĠֻؽ۱ҕඔ൞ॖ࿊֥đ
  143. Programming in Lua 141 Copyright ® 2005, Translation Team, www.luachina.net

    ಌസ౦ঃ༯ i=1b༯૫֥২ሰᇏđ໡ૌࡌקሳژႨ ASCII іൕğ print(string.char(97)) --> a i = 99; print(string.char(i, i+1, i+2)) --> cde print(string.byte("abc")) --> 97 print(string.byte("abc", 2)) --> 98 print(string.byte("abc", -1)) --> 99 ഈ૫ቋު၂ྛđ໡ૌ൐Ⴈڵඔ෬ႄ٠໙ሳژԱ֥ቋު၂۱ሳژb ݦඔ string.format ᄝႨটؓሳژԱࣉྛ۬ൔ߄֥ൈީđหљ൞ሳژԱൻԛđ൞ۿି ఼ն֥۽ऎbᆃ۱ݦඔႵਆ۱ҕඔđ൐Ⴈބ C ე࿽֥ printf ݦඔࠫެ၂ଆ၂ဢđ୆ປಆ ॖၛᅶ C ე࿽֥ printf ট൐Ⴈᆃ۱ݦඔbֻ၂۱ҕඔູ۬ൔ߄ԱğႮᆷൕژބ॥ᇅ۬ൔ ֥ሳژቆӮbᆷൕژު֥॥ᇅ۬ൔ֥ሳژॖၛູğ൅ࣉᇅ'd'Ġ൅ੂࣉᇅ'x'Ġϖࣉᇅ'o'Ġ ڜׄඔ'f'ĠሳژԱ's'bᄝᆷൕژ'%'ބ॥ᇅ۬ൔሳژᆭࡗߎॖၛႵః෰֥࿊ཛğႨট॥ᇅ ۷བྷ༥֥۬ൔđбೂ၂۱ڜׄඔ֥ཬඔ໊֥ඔğ print(string.format("pi = %.4f", PI)) --> pi = 3.1416 d = 5; m = 11; y = 1990 print(string.format("%02d/%02d/%04d", d, m, y)) --> 05/11/1990 tag, title = "h1", "a title" print(string.format("<%s>%s</%s>", tag, title, tag)) --> <h1>a title</h1> ֻ၂۱২ሰđ%.4f սіཬඔׄު૫Ⴕ 4 ໊ཬඔ֥ڜׄඔbֻؽ۱২ሰ%02d սіၛ ܥק֥ਆ໊ཁൕ൅ࣉᇅඔđ҂ቀ֥భ૫Ҁ 0bط%2d భ૫ીႵᆷק 0đ҂ቀਆ໊ൈ߶ၛ ॢϢҀቀbؓႿ۬ൔԱ҆ٳᆷൕژ֤བྷ༥૭ඍౢҕॉ lua ൭Ҩđࠇᆀҕॉ C ൭Ҩđၹູ Lua טႨѓሙ C ֥ printf ݦඔটൌགྷቋᇔ֥ۿିb 2 20 0. .1 1 ଆ ଆൔ ൔ௄ ௄஥ ஥ݦ ݦඔ ඔ ᄝ string ९ᇏۿିቋ఼ն֥ݦඔ൞ğstring.findčሳژԱҰᅳĎ đstring.gsubčಆअሳ ژԱูߐĎ đand string.gfindčಆअሳژԱҰᅳĎ bᆃུݦඔ׻൞ࠎႿଆൔ௄஥֥b აః෰࢖Чე࿽҂๝֥൞đLuaѩ҂൐ႨPOSIX֥ܿٓᆞᄵіղൔ2č္ཿቔregexpĎ টࣉྛଆൔ௄஥bᇶေ֥ჰၹԛႿӱ྽նཬٚ૫֥ॉ੮ğൌགྷ၂۱ׅ྘֥ژކPOSIXѓ ሙ֥regexpնۀླေ 4000 ྛս઒đᆃбᆜ۱Luaѓሙ९ࡆᄝ၂ఏ׻նbಃޙᆭ༯đLua ᇏ֥ଆൔ௄஥֥ൌགྷᆺႨਔ 500 ྛս઒đ֒ಖᆃၩ໅ሢ҂ॖିൌགྷPOSIX෮֥ܿٓ෮Ⴕ ۷ିbಖطđLuaᇏ֥ଆൔ௄஥ۿି൞ޓ఼ն֥đѩ౏Їݣਔ၂ུ൐ႨѓሙPOSIXଆൔ௄ 2 ၲᇿğPOSIX൞unix֥۽ြѓሙđregexpቋԚটჷႿunixđPOSIXؓregexp္ቔਔܿٓb
  144. Programming in Lua 142 Copyright ® 2005, Translation Team, www.luachina.net

    ஥҂ಸၞൌགྷ֥ۿିb string.find ֥ࠎЧႋႨࣼ൞ႨটᄝଢѓԱčsubject stringĎଽෆ෬௄஥ᆷק֥ଆൔ֥ Աbݦඔೂݔᅳ֞௄஥֥Աْ߭෰໊֥ᇂđڎᄵْ߭ nil.ቋࡥֆ֥ଆൔࣼ൞၂۱ֆՍđ ࣇࣇ௄஥ֆՍЧദb бೂđ ଆൔ'hello'ࣇࣇ௄஥ଢѓԱᇏ֥"hello"b ֒Ұᅳ֞ଆൔ֥ൈީđ ݦඔْ߭ਆ۱ᆴğ௄஥Աष൓෬ႄބࢲඏ෬ႄb s = "hello world" i, j = string.find(s, "hello") print(i, j) --> 1 5 print(string.sub(s, i, j)) --> hello print(string.find(s, "world")) --> 7 11 i, j = string.find(s, "l") print(i, j) --> 3 3 print(string.find(s, "lll")) --> nil ২ሰᇏđ௄஥Ӯۿ֥ൈީđstring.sub ০Ⴈ string.find ْ֥߭ᆴࢩ౼௄஥֥ሰԱb čؓ ࡥֆଆൔط࿽đ௄஥֥ࣼ൞ఃЧദĎ string.find ݦඔֻ೘۱ҕඔ൞ॖ࿊֥ğѓൕଢѓԱᇏෆ෬֥ఏ൓໊ᇂb֒໡ૌམҰᅳ ଢѓԱᇏ෮Ⴕ௄஥֥ሰԱ֥ൈީđᆃ۱࿊ཛ٤ӈႵႨb໡ૌॖၛ҂؎֥࿖ߌෆ෬đૄ၂ ՑՖభ၂Ց௄஥֥ࢲඏ໊ᇂष൓b༯૫ु၂۱২ሰđ༯૫֥ս઒Ⴈ၂۱ሳژԱᇏ෮Ⴕ֥ ྍྛܒᄯ၂۱іğ local t = {} -- table to store the indices local i = 0 while true do i = string.find(s, "\n", i+1) -- find 'next' newline if i == nil then break end table.insert(t, i) end ު૫໡ૌߎ߶ु֞ॖၛ൐Ⴈ string.gfind םսሰটࡥ߄ഈ૫ᆃ۱࿖ߌb string.gsub ݦඔႵ೘۱ҕඔğଢѓԱđଆൔԱđูߐԱb෰ࠎЧቔႨ൞ႨটҰᅳ௄ ஥ଆൔ֥Աđѩࡼ൐ႨูߐԱఃูߐוğ s = string.gsub("Lua is cute", "cute", "great") print(s) --> Lua is great s = string.gsub("all lii", "l", "x") print(s) --> axx xii s = string.gsub("Lua is great", "perl", "tcl") print(s) --> Lua is great ֻඹ۱ҕඔ൞ॖ࿊֥đႨটཋᇅูߐ֥ٓຶğ
  145. Programming in Lua 143 Copyright ® 2005, Translation Team, www.luachina.net

    s = string.gsub("all lii", "l", "x", 1) print(s) --> axl lii s = string.gsub("all lii", "l", "x", 2) print(s) --> axx lii string.gsub ֻ֥ؽ۱ْ߭ᆴіൕ෰ࣉྛูߐҠቔ֥Ցඔb২ೂđ༯૫ս઒Ⴄট࠹ෘ ၂۱ሳژԱᇏॢ۬ԛགྷ֥Ցඔğ _, count = string.gsub(str, " ", " ") čᇿၩđ_ ᆺ൞၂۱࿯ჭэਈĎ 2 20 0. .2 2 ଆ ଆൔ ൔ ୆ߎॖၛᄝଆൔԱᇏ൐Ⴈሳژোbሳژোᆷॖၛ௄஥၂۱หקሳژࠢކଽ಩ޅሳژ ֥ ଆ ൔ ཛ b б ೂ đ ሳ ژ ো %d ௄ ஥ ಩ ၩ ඔ ሳ b ෮ ၛ ୆ ॖ ၛ ൐ Ⴈ ଆ ൔ Ա '%d%d/%d%d/%d%d%d%d'ෆ෬ dd/mm/yyyy ۬ൔ֥ರ௹ğ s = "Deadline is 30/05/1999, firm" date = "%d%d/%d%d/%d%d%d%d" print(string.sub(s, string.find(s, date))) --> 30/05/1999 ༯૫֥іਙԛਔ Lua ᆦӻ֥෮Ⴕሳژোğ . ಩ၩሳژ %a ሳଛ %c ॥ᇅሳژ %d ඔሳ %l ཬཿሳଛ %p ѓׄሳژ %s ॢϢژ %u նཿሳଛ %w ሳଛބඔሳ %x ൅ੂࣉᇅඔሳ %z սі 0 ֥ሳژ ഈ૫ሳژো֥նཿྙൔіൕཬཿ෮սі֥ࠢކ֥Ҁࠢb২ೂđ'%A'٤ሳଛ֥ሳژğ print(string.gsub("hello, up-down!", "%A", ".")) --> hello..up.down. 4 čඔሳ 4 ҂൞ሳژԱࢲݔ֥၂҆ٳđ෰൞ gsub ֻْ֥߭ؽ۱ࢲݔđսіؿളูߐ֥ Ցඔb༯૫ః෰֥ܱႿյႆ gsub ࢲݔ֥২ሰᇏࡼ߶ޭ੻ᆃ۱ඔᆴb Ďᄝଆൔ௄஥ᇏႵ၂ ུห൹ሳژđ෰ૌႵห൹֥ၩၬđLua ᇏ֥ห൹ሳژೂ༯ğ
  146. Programming in Lua 144 Copyright ® 2005, Translation Team, www.luachina.net

    ( ) . % + - * ? [ ^ $ '%' Ⴈቔห൹ሳژ֥ሇၬሳژđ ၹՎ '%.' ௄஥ׄĠ '%%' ௄஥ሳژ '%'b ሇၬሳژ '%' ҂ࣇॖၛႨটሇၬห൹ሳژđߎॖၛႨႿ෮Ⴕ֥٤ሳଛ֥ሳژb֒ؓ၂۱ሳژႵၐ໙֥ ൈީđູνಆఏ࡮౨൐Ⴈሇၬሳژሇၬ෰b ؓ Lua ط࿽đଆൔԱࣼ൞௴๙֥ሳژԱb෰ૌބః෰֥ሳژԱીႵ౵љđ္҂߶൳ ֞ห൹ؓրbᆺႵ෰ૌФႨቔଆൔԱႨႿݦඔ֥ൈީđ'%' Ҍቔູሇၬሳژb෮ၛđೂ ݔ୆ླေᄝ၂۱ଆൔԱଽ٢ᇂႄݼ֥߅đ୆сྶ൐Ⴈᄝః෰֥ሳژԱᇏ٢ᇂႄݼ֥ٚم টԩ৘đ൐Ⴈ '\' ሇၬႄݼđ'\' ൞ Lua ֥ሇၬژb୆ॖၛ൐Ⴈٚওݼࡼሳژোࠇᆀሳژ ওఏটԷࡹሱ֥࠭ሳژোčၲᆀğLua ӫᆭູ char-setđࣼ൞ᆷԮ๤ᆞᄵіղൔۀ୑ᇏ֥ ওݼіղൔĎ b бೂđ '[%w_]' ࡼ௄஥ሳଛඔሳބ༯߃ཌđ '[01]' ௄஥ؽࣉᇅඔሳđ '[%[%]]' ௄஥၂ؓٚওݼb༯૫֥২ሰ๤࠹໓Чᇏჭၻሳଛԛགྷ֥Ցඔğ _, nvow = string.gsub(text, "[AEIOUaeiou]", "") ᄝ char-set ᇏॖၛ൐Ⴈٓຶіൕሳژ֥ࠢކđֻ၂۱ሳژބቋު၂۱ሳژᆭࡗႨ৵ ሳژ৵ࢤіൕᆃਆ۱ሳژᆭࡗٓຶଽ֥ሳژࠢކbն҆ٳ֥ӈႨሳژٓຶ׻ၘࣜყקၬ ݺਔđ෮ၛ၂Ϯ୆҂ླေሱ࠭קၬሳژ֥ࠢކbбೂđ'%d' іൕ '[0-9]'Ġ'%x' іൕ '[0-9a-fA-F]'bಖطđೂݔ୆མҰᅳϖࣉᇅඔđ୆ॖି۷༟ߋ൐Ⴈ '[0-7]' ط҂൞ '[01234567]'b୆ॖၛᄝሳژࠢ(char-set)֥ष൓ԩ൐Ⴈ '^' іൕఃҀࠢğ'[^0-7]' ௄஥಩ޅ ҂൞ϖࣉᇅඔሳ֥ሳژĠ'[^\n]' ௄஥಩ޅ٤ߐྛژ޼֥ሳژb࠺ᇾđॖၛ൐Ⴈնཿ֥ሳ ژোіൕఃҀࠢğ'%S' б '[^%s]' ေࡥ؋ུb Lua ֥ሳژো၇ঠႿЧֹߌ࣢đ෮ၛ '[a-z]' ॖିა '%l' іൕ֥ሳژࠢ҂๝bᄝ၂ Ϯ౦ঃ༯đުᆀЇও 'ç' ބ 'ã'đطభᆀીႵbႋھ࣐ॖି֥൐ႨުᆀটіൕሳଛđԢ٤ ԛႿଖུห൹ॉ੮đၹູުᆀ۷ࡥֆaٚьa۷ིۚb ॖၛ൐Ⴈྩ൥ژটྩ൥ଆൔᄹ఼ଆൔ֥іղି৯đLua ᇏ֥ଆൔྩ൥ژႵඹ۱ğ + ௄஥భ၂ሳژ 1 Ցࠇ؟Ց * ௄஥భ၂ሳژ 0 Ցࠇ؟Ց - ௄஥భ၂ሳژ 0 Ցࠇ؟Ց ? ௄஥భ၂ሳژ 0 Ցࠇ 1 Ց '+'đ௄஥၂۱ࠇ؟۱ሳژđሹ൞ࣉྛቋӉ֥௄஥bбೂđଆൔԱ '%a+' ௄஥၂۱ࠇ ؟۱ሳଛࠇᆀ၂۱ֆՍğ print(string.gsub("one, and two; and three", "%a+", "word")) --> word, word word; word word '%d+' ௄஥၂۱ࠇ؟۱ඔሳčᆜඔĎ ğ i, j = string.find("the number 1298 is even", "%d+") print(i,j) --> 12 15 '*' ა '+' োරđ֌൞෰௄஥၂۱ሳژ 0 Ցࠇ؟Ցԛགྷ.၂۱ׅ྘֥ႋႨ൞௄஥ॢϢb
  147. Programming in Lua 145 Copyright ® 2005, Translation Team, www.luachina.net

    бೂđູਔ௄஥၂ؓჵওݼ()ࠇᆀওݼᆭࡗ֥ॢϢđॖၛ൐Ⴈ '%(%s*%)'b č '%s*' Ⴈট ௄஥ 0 ۱ࠇ؟۱ॢϢbႮႿჵওݼᄝଆൔᇏႵห൹֥ݣၬđ෮ၛ໡ૌсྶ൐Ⴈ '%' ሇၬ ෰b Ďᄜु၂۱২ሰđ'[_%a][_%w]*' ௄஥ Lua ӱ྽ᇏ֥ѓൕژğሳଛࠇᆀ༯߃ཌष๨֥ ሳଛ༯߃ཌඔሳ྽ਙb '-' ა '*' ၂ဢđ׻௄஥၂۱ሳژ֥ 0 Ցࠇ؟Ցԛགྷđ֌൞෰ࣉྛ֥൞ቋ؋௄஥bଖ ུൈީᆃਆ۱ႨఏটીႵ౵љđ֌Ⴕུൈީࢲݔࡼࢩಖ҂๝bбೂđೂݔ୆൐Ⴈଆൔ '[_%a][_%w]-' টҰᅳѓൕژđ୆ࡼᆺିᅳֻ֞၂۱ሳଛđၹູ '[_%w]-' Ⴅჹ௄஥ॢb ਸ਼၂ٚ૫đࡌק୆མҰᅳ C ӱ྽ᇏ֥ᇿ൤đޓ؟ದॖି൐Ⴈ '/%*.*%*/'č္ࣼ൞ඪ "/*" ު૫۵ሢ಩ၩ؟۱ሳژđಖު۵ሢ "*/" Ď bಖطđႮႿ '.*' ࣉྛ֥൞ቋӉ௄஥đᆃ۱ଆ ൔࡼ௄஥ӱ྽ᇏֻ၂۱ "/*" ބቋު၂۱ "*/" ᆭࡗ෮Ⴕ҆ٳğ test = "int x; /* x */ int y; /* y */" print(string.gsub(test, "/%*.*%*/", "<COMMENT>")) --> int x; <COMMENT> ಖطଆൔ '.-' ࣉྛ֥൞ቋ؋௄஥đෲ߶௄஥ "/*" ष൓ֻ֞၂۱ "*/" ᆭభ֥҆ٳğ test = "int x; /* x */ int y; /* y */" print(string.gsub(test, "/%*.-%*/", "<COMMENT>")) --> int x; <COMMENT> int y; <COMMENT> '?' ௄஥၂۱ሳژ 0 Ցࠇ 1 Ցbई۱২ሰđࡌק໡ૌམᄝ၂؍໓ЧଽҰᅳ၂۱ᆜඔđ ᆜඔॖିջႵᆞڵݼbଆൔ '[+-]?%d+' ژކ໡ૌ֥ေ౰đ෱ॖၛ௄஥ཞ "-12"a"23" ބ "+1009" ֩ඔሳb'[+-]' ൞၂۱௄஥ '+' ࠇᆀ '-' ֥ሳژোĠࢤ༯ট֥ '?' ၩන൞௄஥భ ૫֥ሳژো 0 Ցࠇᆀ 1 Ցb აః෰༢๤֥ଆൔ҂๝֥൞đLua ᇏ֥ྩ൥ژ҂ିႨሳژোĠ҂ିࡼଆൔٳቆಖު ൐Ⴈྩ൥ژቔႨᆃ۱ٳቆbбೂđીႵ၂۱ଆൔॖၛ௄஥၂۱ॖ࿊֥ֆՍčԢ٤ᆃ۱ֆ ՍᆺႵ၂۱ሳଛĎ b༯૫໡ࡼु֞đ๙ӈ୆ॖၛ൐Ⴈ၂ུۚࠩ࠯ඌಡषᆃ۱ཋᇅb ၛ '^' ष๨֥ଆൔᆺ௄஥ଢѓԱ֥ष൓҆ٳđཌྷර֥đၛ '$' ࢲແ֥ଆൔᆺ௄஥ଢ ѓԱ֥ࢲແ҆ٳbᆃ҂ࣇॖၛႨটཋᇅ୆ေҰᅳ֥ଆൔđߎॖၛק໊čanchorĎଆൔb бೂğ if string.find(s, "^%d") then ... ࡟ҰሳژԱ s ൞ڎၛඔሳष๨đط if string.find(s, "^[+-]?%d+$") then ... ࡟ҰሳژԱ s ൞ڎ൞၂۱ᆜඔb '%b' Ⴈট௄஥ؓӫ֥ሳژbӈཿູ '%bxy' đx ބ y ൞಩ၩਆ۱҂๝֥ሳژĠx ቔູ ௄஥֥ष൓đy ቔູ௄஥֥ࢲඏbбೂđ'%b()' ௄஥ၛ '(' ष൓đၛ ')' ࢲඏ֥ሳژԱğ print(string.gsub("a (enclosed (in) parentheses) line", "%b()", ""))
  148. Programming in Lua 146 Copyright ® 2005, Translation Team, www.luachina.net

    --> a line ӈႨ֥ᆃᇕଆൔႵğ'%b()' đ'%b[]'đ'%b%{%}' ބ '%b<>'b୆္ॖၛ൐Ⴈ಩ޅሳژ ቔູٳۯژb 2 20 0. .3 3 ѽ ѽࠆ ࠆč čC Ca ap pt tu ur re es sĎ Ď Capture3൞ᆃဢ၂ᇕࠏᇅğ ॖၛ൐ႨଆൔԱ֥၂҆ٳ௄஥ଢѓԱ֥၂҆ٳb ࡼ୆མѽ ࠆ֥ଆൔႨჵওݼওఏটđࣼᆷקਔ၂۱captureb ᄝ string.find ൐Ⴈ captures ֥ൈީđ ݦඔ߶ْ߭ѽࠆ֥ᆴቔູحຓ֥ࢲݔb ᆃӈФႨ টࡼ၂۱ଢѓԱҷٳӮ؟۱ğ pair = "name = Anna" _, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)") print(key, value) --> name Anna '%a+' іൕ٣ॢ֥ሳଛ྽ਙĠ'%s*' іൕ 0 ۱ࠇ؟۱ॢϢbᄝഈ૫֥২ሰᇏđᆜ۱ଆ ൔսіğ၂۱ሳଛ྽ਙđު૫൞಩ၩ؟۱ॢϢđಖު൞ '=' ᄜު૫൞಩ၩ؟۱ॢϢđಖ ު൞၂۱ሳଛ྽ਙbਆ۱ሳଛ྽ਙ׻൞൐Ⴈჵওݼওఏট֥ሰଆൔđ֒෰ૌФ௄஥֥ൈ ީđ෰ૌࣼ߶Фѽࠆb֒௄஥ؿള֥ൈީđfind ݦඔሹ൞ْ༵߭௄஥Ա֥෬ႄ༯ѓčഈ ૫২ሰᇏ໡ૌթԥ࿯ჭэਈ _ ᇏĎ đಖުْ߭ሰଆൔ௄஥֥ѽࠆ҆ٳb༯૫֥২ሰ౦ঃ োරğ date = "17/7/1990" _, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)") print(d, m, y) --> 17 7 1990 ໡ૌॖၛᄝଆൔᇏ൐ႨཟభႄႨđ '%d' čd սі 1-9 ֥ඔሳĎ іൕֻ d ۱ѽࠆ֥ॊНb ु۱২ሰđࡌק୆མҰᅳ၂۱ሳژԱᇏֆႄݼࠇᆀචႄݼႄఏট֥ሰԱđ୆ॖି൐Ⴈଆ ൔ '["'].-["']'đ֌൞ᆃ۱ଆൔؓԩ৘োරሳژԱ "it's all right" ߶ԛ໙ีbູਔࢳथᆃ۱໙ ีđॖၛ൐ႨཟభႄႨđ൐Ⴈѽࠆֻ֥၂۱ႄݼটіൕֻؽ۱ႄݼğ s = [[then he said: "it's all right"!]] a, b, c, quotedPart = string.find(s, "(["'])(.-)%1") print(quotedPart) --> it's all right print(c) --> " ֻ၂۱ѽࠆ൞ႄݼሳژЧദđ ֻؽ۱ѽࠆ൞ႄݼᇏࡗ֥ଽಸ č'.-' ௄஥ႄݼᇏࡗ֥ሰ ԱĎ b ѽࠆᆴֻ֥೘۱ႋႨ൞Ⴈᄝݦඔ gsub ᇏbაః෰ଆൔ၂ဢđgsub ู֥ߐԱॖၛЇ 3ၲᇿğ༯૫ၲູѽࠆࠇᆀcaptuređଆൔᇏѽࠆ֥ۀ୑ᆷđ൐ႨਢൈэਈটЌթ௄஥֥ሰଆൔđӈႨႿ ཟభႄႨb
  149. Programming in Lua 147 Copyright ® 2005, Translation Team, www.luachina.net

    ݣ '%d'đู֒ߐؿളൈ෰Фሇߐູؓႋ֥ѽࠆᆴb čඨьඪ၂༯đႮႿթᄝᆃུ౦ঃđ ูߐԱᇏ֥ሳژ '%' сྶႨ "%%" іൕĎ b༯૫২ሰᇏđؓ၂۱ሳژԱᇏ֥ૄ၂۱ሳଛ ࣉྛگᇅđѩႨ৵ሳژࡼگᇅ֥ሳଛބჰሳଛ৵ࢤఏটğ print(string.gsub("hello Lua!", "(%a)", "%1-%1")) --> h-he-el-ll-lo-o L-Lu-ua-a! ༯૫ս઒޺ߐཌྷਣ֥ሳژ: print(string.gsub("hello Lua", "(.)(.)", "%2%1")) --> ehll ouLa ಞ໡ૌु၂۱۷ႵႨ֥২ሰđཿ၂۱۬ൔሇߐఖğՖଁ਷ྛࠆ౼ LaTeX ڄ֥۬ሳژ Աđྙೂğ \command{some text} ࡼ෱ૌሇߐູ XML ڄ֥۬ሳژԱğ <command>some text</command> ؓႿᆃᇕ౦ঃ,༯૫֥ս઒ॖၛൌགྷᆃ۱ۿିğ s = string.gsub(s, "\\(%a+){(.-)}", "<%1>%2</%1>") бೂđೂݔሳژԱ s ູğ the \quote{task} is to \em{change} that. טႨ gsub ᆭުđሇߐູğ the <quote>task</quote> is to change that. ਸ਼၂۱ႵႨ֥২ሰ൞ಀԢሳژԱ൮ແ֥ॢ۬ğ function trim (s) return (string.gsub(s, "^%s*(.-)%s*$", "%1")) end ᇿၩଆൔԱ֥Ⴈمđਆ۱ק໊ژč'^' ބ '$'ĎЌᆣ໡ૌࠆ౼֥൞ᆜ۱ሳژԱbၹູđ ਆ۱ '%s*' ௄஥൮ແ֥෮Ⴕॢ۬đ'.-' ௄஥ഺჅ҆ٳbߎႵ၂ׄླေᇿၩ֥൞ gsub ْ߭ ਆ۱ᆴđ໡ૌ൐Ⴈحຓ֥ჵওݼשఙ؟Ⴥ֥ࢲݔčูߐؿള֥ՑඔĎ b ቋު၂۱ѽࠆᆴႋႨᆭԩॖି൞ۿିቋ఼ն֥b໡ૌॖၛ൐Ⴈ၂۱ݦඔቔູ string.gsub ֻ֥೘۱ҕඔטႨ gsubb ᄝᆃᇕ౦ঃ༯đ string.gsub ૄՑؿགྷ၂۱௄஥֥ൈީ ࣼ߶טႨ۳ק֥ቔູҕඔ֥ݦඔđѽࠆᆴॖၛቔູФטႨ֥ᆃ۱ݦඔ֥ҕඔđطᆃ۱ݦ ඔْ֥߭ᆴቔູ gsub ู֥ߐԱb༵ु၂۱ࡥֆ֥২ሰđ༯૫֥ս઒ࡼ၂۱ሳژԱᇏಆअ эਈ$varname ԛགྷֹู֥ٚߐູэਈ varname ֥ᆴğ function expand (s) s = string.gsub(s, "$(%w+)", function (n)
  150. Programming in Lua 148 Copyright ® 2005, Translation Team, www.luachina.net

    return _G[n] end) return s end name = "Lua"; status = "great" print(expand("$name is $status, isn't it?")) --> Lua is great, isn't it? ೂݔ୆҂ିಒק۳ק֥эਈ൞ڎູ string ো྘đॖၛ൐Ⴈ tostring ࣉྛሇߐğ function expand (s) return (string.gsub(s, "$(%w+)", function (n) return tostring(_G[n]) end)) end print(expand("print = $print; a = $a")) --> print = function: 0x8050ce0; a = nil ༯૫൞၂۱഍ັگᄖ֥ׄ২ሰđ൐Ⴈ loadstring ট࠹ෘ၂؍໓Чଽ$ު૫۵ሢ၂ؓٚ ওݼଽіղൔ֥ᆴğ s = "sin(3) = $[math.sin(3)]; 2^5 = $[2^5]" print((string.gsub(s, "$(%b[])", function (x) x = "return " .. string.sub(x, 2, -2) local f = loadstring(x) return f() end))) --> sin(3) = 0.1411200080598672; 2^5 = 32 ֻ၂Ց௄஥൞ "$[math.sin(3)]"đؓႋ֥ѽࠆູ "$[math.sin(3)]"đטႨ string.sub ಀ ו൮ແ֥ٚওݼđ ෮ၛФࡆᄛᆳྛ֥ሳژԱ൞ "return math.sin(3)"đ "$[2^5]" ֥௄஥౦ঃ োරb ໡ૌӈӈླေ൐Ⴈ string.gsub ђ৥ሳژԱđطْؓ߭ࢲݔ҂ۋྖ౿bбೂđ໡ૌ൬ ࠢ၂۱ሳژԱᇏ෮Ⴕ֥ֆՍđಖުҬೆ֞၂۱іᇏğ words = {} string.gsub(s, "(%a+)", function (w) table.insert(words, w)
  151. Programming in Lua 149 Copyright ® 2005, Translation Team, www.luachina.net

    end) ೂݔሳژԱ s ູ "hello hi, again!"đഈ૫ս઒֥ࢲݔࡼ൞ğ {"hello", "hi", "again"} ൐Ⴈ string.gfind ݦඔॖၛࡥ߄ഈ૫֥ս઒ğ words = {} for w in string.gfind(s, "(%a)") do table.insert(words, w) end gfind ݦඔбࢠൡކႨႿٓྟ for ࿖ߌb෰ॖၛђ৥၂۱ሳژԱଽ෮Ⴕ௄஥ଆൔ֥ሰ Աb໡ૌॖၛࣉ၂֥҄ࡥ߄ഈ૫֥ս઒đטႨ gfind ݦඔ֥ൈީđೂݔ҂ཁൕ֥ᆷקѽ ࠆđݦඔࡼѽࠆᆜ۱௄஥ଆൔb෮ၛđഈ૫ս઒ॖၛࡥ߄ູğ words = {} for w in string.gfind(s, "%a") do table.insert(words, w) end ༯૫֥২ሰ໡ૌ൐Ⴈ URL щ઒đ URL щ઒൞ HTTP ླྀၰটႨؿෂ URL ᇏ֥ҕඔࣉ ྛ֥щ઒bᆃᇕщ઒ࡼ၂ུห൹ሳژčбೂ '='a'&'a'+'Ďሇߐູ "%XX" ྙൔ֥щ઒đ ఃᇏ XX ൞ሳژ֥ 16 ࣉᇅіൕđಖުࡼॢϢሇߐӮ '+'bбೂđࡼሳژԱ "a+b = c" щ ઒ູ "a%2Bb+%3D+c"bቋުđࡼҕඔ଀ބҕඔᆴᆭࡗࡆ၂۱ '='Ġᄝ name=value ؓᆭ ࡗࡆ၂۱ "&"bбೂሳژԱğ name = "al"; query = "a+b = c"; q="yes or no" Фщ઒ູğ name=al&query=a%2Bb+%3D+c&q=yes+or+no གྷᄝđࡌೂ໡ૌམࢃᆃ URL ࢳ઒ѩϜૄ۱ᆴթԥ֞іᇏđ༯ѓູؓႋ֥଀ሳb༯૫ ֥ݦඔൌགྷਔࢳ઒ۿିğ function unescape (s) s = string.gsub(s, "+", " ") s = string.gsub(s, "%%(%x%x)", function (h) return string.char(tonumber(h, 16)) end) return s end ֻ၂۱ეओࡼ '+' ሇߐӮॢϢđֻؽ۱ gsub ௄஥෮Ⴕ֥ '%' ު۵ਆ۱ඔሳ֥ 16 ࣉ ᇅඔđಖުטႨ၂۱େ଀ݦඔđେ଀ݦඔࡼ 16 ࣉᇅඔሇߐӮ၂۱ඔሳčtonumber ᄝ 16 ࣉᇅ౦ঃ༯൐Ⴈ֥Ďಖުᄜሇ߄ູؓႋ֥ሳژbбೂğ
  152. Programming in Lua 150 Copyright ® 2005, Translation Team, www.luachina.net

    print(unescape("a%2Bb+%3D+c")) --> a+b = c ؓႿ name=value ؓđ໡ૌ൐Ⴈ gfind ࢳ઒đၹູ names ބ values ׻҂ିЇݣ '&' ބ '=' ໡ૌॖၛႨଆൔ '[^&=]+' ௄஥෰ૌğ cgi = {} function decode (s) for name, value in string.gfind(s, "([^&=]+)=([^&=]+)") do name = unescape(name) value = unescape(value) cgi[name] = value end end טႨ gfind ݦඔ௄஥෮Ⴕ֥ name=value ؓđ ؓႿૄ၂۱ name=value ؓđ םսሰࡼః ཌྷؓႋ֥ѽࠆ֥ᆴْ߭۳эਈ name ބ valueb࿖ߌุଽטႨ unescape ݦඔࢳ઒ name ބ value ҆ٳđѩࡼఃթԥ֞ cgi іᇏb აࢳ઒ؓႋ֥щ઒္ޓಸၞൌགྷb൮༵đ໡ૌཿ၂۱ escape ݦඔđᆃ۱ݦඔࡼ෮Ⴕ ֥ห൹ሳژሇߐӮ '%' ު۵ሳژؓႋ֥ ASCII ઒ሇߐӮਆ໊֥ 16 ࣉᇅඔሳ č҂ቀਆ໊đ భ૫Ҁ 0Ď đಖުࡼॢϢሇߐູ '+'ğ function escape (s) s = string.gsub(s, "([&=+%c])", function (c) return string.format("%%%02X", string.byte(c)) end) s = string.gsub(s, " ", "+") return s end щ઒ݦඔђ৥ေФщ઒֥іđܒᄯቋᇔ֥ࢲݔԱğ function encode (t) local s = "" for k,v in pairs(t) do s = s .. "&" .. escape(k) .. "=" .. escape(v) end return string.sub(s, 2) -- remove first `&' end t = {name = "al", query = "a+b = c", q="yes or no"} print(encode(t)) --> q=yes+or+no&query=a%2Bb+%3D+c&name=al
  153. Programming in Lua 151 Copyright ® 2005, Translation Team, www.luachina.net

    2 20 0. .4 4 ሇ ሇߐ ߐ֥ ֥࠯ ࠯ె ెč čT Tr ri ic ck ks s o of f t th he e T Tr ra ad de eĎ Ď ଆൔ௄஥ؓႿሳژԱҠሺটඪ൞఼ն֥۽ऎđ୆ॖିᆺླေࡥֆ֥טႨ string.gsub ބ find ࣼॖၛປӮگᄖ֥Ҡቔđಖطđၹູ෱ۿି఼ն୆сྶࣈര֥൐Ⴈ෱đڎᄵ߶ջ টၩམ҂֥֞ࢲݔb ؓᆞӈ֥ࢳ༅ఖط࿽đଆൔ௄஥҂൞၂۱ูս௖bؓႿ၂۱ quick-and-dirty ӱ྽đ ୆ॖၛᄝჷս઒ഈࣉྛ၂ུႵႨ֥Ҡቔđ֌ޓ଴ປӮ၂۱ۚᇉਈ֥Ӂ௖bభ૫ิ֥֞௄ ஥ C ӱ྽ᇏᇿ൤֥ଆൔ൞۱ޓݺ֥২ሰğ'/%*.-%*/'bೂݔ୆֥ӱ྽Ⴕ၂۱ሳژԱЇݣਔ "/*"đቋᇔ୆ࡼ֤֞հ༂֥ࢲݔğ test = [[char s[] = "a /* here"; /* a tricky string */]] print(string.gsub(test, "/%*.-%*/", "<COMMENT>")) --> char s[] = "a <COMMENT> ෙಖᆃဢଽಸ֥ሳژԱޓݨ࡮đೂݔ൞୆ሱ࠭൐Ⴈ֥߅ഈ૫֥ଆൔॖିߎ՘ࠃb֌ ୆҂ିࡼ၂۱ջႵᆃᇕરѨ֥ӱ྽ቔູӁ௖ԛ൲b ၂Ϯ౦ঃ༯đ Lua ᇏ֥ଆൔ௄஥ིੱ൞҂հ֥ğ ၂۱Хอ 333MHz ࠏఖᄝ၂۱Ⴕ 200K ሳژ֥໓Чଽ௄஥෮Ⴕ֥ֆՍ(30K ֥ֆՍ)ᆺླေ 1/10 ૰b֌൞୆҂ିוၛ౞ྏđႋھ ၂ᆰؓ҂๝֥౦ঃห൹ؓրđ࣐ॖି֥۷ૼಒ֥ଆൔ૭ඍb၂۱ཋᇅॺ඾֥ଆൔбཋᇅ ࿸֥۬ଆൔॖିતޓ؟b ၂۱ࠞ؊֥২ሰ൞ଆൔ '(.-)%$' Ⴈটࠆ౼၂۱ሳژԱଽ$ژݼၛ భ෮Ⴕ֥ሳژđೂݔଢѓԱᇏթᄝ$ژݼđીႵ൉હ໙ีĠ֌൞ೂݔଢѓԱᇏ҂թᄝ$ژ ݼbഈ૫֥ෘم߶൮༵ՖଢѓԱֻ֥၂۱ሳژष൓ࣉྛ௄஥đђ৥ᆜ۱ሳژԱᆭުીႵ ᅳ֞$ژݼđ ಖުՖଢѓԱֻ֥ؽ۱ሳژष൓ࣉྛ௄஥đ llᆃࡼ޽ٮჰট௜ٚՑૢ֥ൈ ࡗđ֝ᇁᄝ၂۱Хอ 333MHz ֥ࠏఖᇏླေ 3 ۱؟ཬൈটԩ৘၂۱ 200K ֥໓ЧԱbॖ ၛ൐Ⴈ༯૫ᆃ۱ଆൔх૧ഈ૫֥໙ี '^(.-)%$'b ק໊ژ^ۡුෘمೂݔᄝֻ၂۱໊ᇂીႵ ીᅳ֞௄஥֥ሰԱࣼ๔ᆸҰᅳb൐Ⴈᆃ۱ק໊ژᆭުđ๝ဢ֥ߌ࣢္ᆺླေ҂֞ 1/10 ૰ ֥ൈࡗb ္ླေཬྏॢଆൔğ௄஥ॢԱ֥ଆൔbбೂđೂݔ୆յෘႨଆൔ '%a*' ௄஥଀ሳđ ୆߶ؿགྷ֞ԩ׻൞଀ሳğ i, j = string.find(";$% **#$hello13", "%a*") print(i,j) --> 1 0 ᆃ۱২ሰᇏטႨ string.find ᆞಒ֥ᄝଢѓԱ֥ष൓ԩ௄஥ਔॢሳژbႥჹ҂ေཿ၂ ۱ၛ '-' ष๨ࠇᆀࢲແ֥ଆൔđၹູ෱ࡼ௄஥ॢԱbᆃ۱ྩ൥ژ֤ᇛຶሹ൞ླေ၂ུת ༆টק໊෰֥ঔᅚbཌྷර֥đ၂۱Їݣ '.*' ֥ଆൔ൞၂۱ླေᇿၩ֥đၹູᆃ۱ࢲܒॖ ି߶б୆ყෘ֥ঔᅚ֥ေ؟b Ⴕൈީđ൐Ⴈ Lua Чദܒᄯଆൔ൞ޓႵႨ֥bु၂۱২ሰđ໡ૌҰᅳ၂۱໓Чᇏྛ ሳژնႿ 70 ۱֥ྛđ္ࣼ൞௄஥၂۱٤ߐྛژᆭభႵ 70 ۱ሳژ֥ྛb໡ૌ൐Ⴈሳژো '[^\n]'іൕ٤ߐྛژ֥ሳژb෮ၛđ໡ૌॖၛ൐Ⴈᆃဢ၂۱ଆൔটડቀ໡ૌ֥ླေğᇗگ
  154. Programming in Lua 152 Copyright ® 2005, Translation Team, www.luachina.net

    ௄஥ֆ۱ሳژ֥ଆൔ 70 Ցđ ު૫۵ሢ၂۱௄஥၂۱ሳژ 0 Ցࠇ؟Ց֥ଆൔb ໡ૌ҂൭۽ টཿᆃ۱ቋᇔ֥ଆൔđط൐Ⴈݦඔ string.repğ pattern = string.rep("[^\n]", 70) .. "[^\n]*" ਸ਼၂۱২ሰđࡌೂ୆མࣉྛ၂۱նཬཿ໭ܱ֥Ұᅳbٚمᆭ၂൞ࡼ಩ޅ၂۱ሳژ x эູሳژো '[xX]'b໡ૌ္ॖၛ൐Ⴈ၂۱ݦඔࣉྛሱ׮ሇߐğ function nocase (s) s = string.gsub(s, "%a", function (c) return string.format("[%s%s]", string.lower(c), string.upper(c)) end) return s end print(nocase("Hi there!")) --> [hH][iI] [tT][hH][eE][rR][eE]! Ⴕൈީ୆ॖିམေࡼሳژԱ s1 ሇ߄ູ s2đط҂ܱྏఃᇏ֥ห൹ሳژbೂݔሳژԱ s1 ބ s2 ׻൞ሳژԱ྽ਙđ୆ॖၛ۳ఃᇏ֥ห൹ሳژࡆഈሇၬሳژটൌགྷb֌൞ೂݔᆃ ུሳژԱ൞эਈ଻đ୆ॖၛ൐Ⴈ gsub টປӮᆃᇕሇၬğ s1 = string.gsub(s1, "(%W)", "%%%1") s2 = string.gsub(s2, "%%", "%%%%") ᄝҰᅳԱᇏđ໡ૌሇၬਔ෮Ⴕ֥٤ሳଛ֥ሳژbᄝูߐԱᇏđ໡ૌᆺሇၬਔ '%' b ਸ਼၂۱ؓଆൔ௄஥ط࿽ႵႨ֥࠯ඌ൞ᄝࣉྛᆇᆞԩ৘ᆭభđؓଢѓԱ༵ࣉྛყԩ৘b၂ ۱ყԩ৘֥ࡥֆ২ሰ൞đࡼ၂؍໓Чଽ֥චႄݼଽ֥ሳژԱሇߐູնཿđ֌൞ေᇿၩච ႄݼᆭࡗॖၛЇݣሇၬ֥ႄݼč"""Ď ğ ᆃ൞၂۱ׅ྘֥ሳژԱ২ሰğ "This is "great"!". ໡ૌԩ৘ᆃᇕ౦ঃ֥ٚم൞đყԩ৘໓ЧϜႵ໙ี֥ሳژ྽ਙሇߐӮః෰֥۬ൔb бೂđ໡ૌॖၛࡼ """ щ઒ູ "\1"đ֌൞ೂݔჰ൓֥໓ЧᇏЇݣ "\1"đ໡ૌႻཊೆઐِ ᆭᇏb၂۱х૧ᆃ۱໙ี֥ࡥֆ֥ٚم൞ࡼ෮Ⴕ "\x" ো྘֥щ઒ູ "\ddd"đఃᇏ ddd ൞ሳژ x ֥൅ࣉᇅіൕğ function code (s) return (string.gsub(s, "\\(.)", function (x) return string.format("\\%03d", string.byte(x)) end)) end ᇿၩđჰ൓Աᇏ֥ "\ddd" ္߶Фщ઒đࢳ઒൞ޓಸၞ֥ğ
  155. Programming in Lua 153 Copyright ® 2005, Translation Team, www.luachina.net

    function decode (s) return (string.gsub(s, "\\(%d%d%d)", function (d) return "\" .. string.char(d) end)) end ೂݔФщ઒֥Ա҂Їݣ಩ޅሇၬژđ ໡ૌॖၛࡥֆ֥൐Ⴈ ' ".-" ' টҰᅳචႄݼሳژ Աğ s = [[follows a typical string: "This is "great"!".]] s = code(s) s = string.gsub(s, '(".-")', string.upper) s = decode(s) print(s) --> follows a typical string: "THIS IS "GREAT"!". ۷ࣅ෪֥ྙൔğ print(decode(string.gsub(code(s), '(".-")', string.upper))) ໡ૌ߭֞భ૫֥၂۱২ሰđሇߐ\command{string}ᆃᇕ۬ൔ֥ଁ਷ູ XML ڄ۬ğ <command>string</command> ֌൞ᆃ၂Ց໡ૌჰ൓֥۬ൔᇏॖၛЇݣّོۗቔູሇၬژđ ᆃဢࣼॖၛ൐Ⴈ"\"a "\{" ބ "\}"đٳљіൕ '\'a'{' ބ '}'bູਔх૧ଁ਷ބሇၬ֥ሳژࠁކᄝ၂ఏđ໡ૌႋھ൮ ༵ࡼჰ൓Աᇏ֥ᆃུห൹྽ਙᇗྍщ઒đಖطđაഈ૫֥၂۱২ሰ҂๝֥൞đ໡ૌ҂ି ሇၬ෮Ⴕ֥ \xđၹູᆃဢ߶ࡼ໡ૌ֥ଁ਷č\commandĎ္ሇߐוbᆃ৚đ໡ૌࣇ֒ x ҂൞ሳژ֥ൈީҌؓ \x ࣉྛщ઒ğ function code (s) return (string.gsub(s, '\\(%A)', function (x) return string.format("\\%03d", string.byte(x)) end)) end ࢳ઒҆ٳބഈ૫ପ۱২ሰোරđ֌൞ᄝቋᇔ֥ሳژԱᇏ҂Їݣّོۗđ෮ၛ໡ૌॖ ᆰࢤטႨ string.charğ function decode (s) return (string.gsub(s, '\\(%d%d%d)', string.char)) end s = [[a \emph{command} is written as \\command\{text\}.]] s = code(s) s = string.gsub(s, "\\(%a+){(.-)}", "<%1>%2</%1>")
  156. Programming in Lua 154 Copyright ® 2005, Translation Team, www.luachina.net

    print(decode(s)) --> a <emph>command</emph> is written as \command{text}. ໡ૌቋު၂۱২ሰ൞ԩ৘ CSVč׹ݼٳ۩Ď֥໓ࡱđޓ؟ӱ྽׻൐Ⴈᆃᇕ۬ൔ֥໓ Чđбೂ Microsoft ExcelbCSV ໓ࡱ൅؟่࠺੣֥ਙіđૄ၂่࠺੣၂ྛđ၂ྛଽᆴა ᆴᆭࡗ׹ݼٳ۩đೂݔ၂۱ᆴଽ္Їݣ׹ݼᆃ۱ᆴсྶႨචႄݼႄఏটđೂݔᆴଽߎЇ ݣචႄݼđ ླ൐Ⴈචႄݼሇၬචႄݼ čࣼ൞ਆ۱චႄݼіൕ၂۱Ď đ ु২ሰđ ༯૫֥ඔቆğ {'a b', 'a,b', 'a,"b"c', 'hello "world"!', } ॖၛुቔູğ a b,"a,b"," a,""b""c", hello "world"!, ࡼ၂۱ሳژԱඔቆሇߐູ CSV ۬ൔ֥໓ࡱ൞٤ӈಸၞ֥b ໡ૌေቓ֥ᆺ൞൐Ⴈ׹ݼ ࡼ෮Ⴕ֥ሳژԱ৵ࢤఏটğ function toCSV (t) local s = "" for _,p in pairs(t) do s = s .. "," .. escapeCSV(p) end return string.sub(s, 2) -- remove first comma end ೂݔ၂۱ሳژԱЇݣ׹ݼࠃሢႄݼᄝ৚૫đ ໡ૌླေ൐Ⴈႄݼࡼᆃ۱ሳژԱႄఏটđ ѩሇၬჰ൓֥ႄݼğ function escapeCSV (s) if string.find(s, '[,"]') then s = '"' .. string.gsub(s, '"', '""') .. '"' end return s end ࡼ CSV ໓ࡱଽಸթ٢֞၂۱ඔቆᇏ഍ັႵׄ଴؇đ ၹູ໡ૌсྶ౵ٳԛ໊Ⴟႄݼᇏ ࡗ֥׹ݼބٳ۩თ֥׹ݼb໡ૌॖၛഡمሇၬ໊Ⴟႄݼᇏࡗ֥׹ݼđಖطѩ҂൞෮Ⴕ֥ ႄݼ׻൞ቔູႄݼթᄝđᆺႵᄝ׹ݼᆭު֥ႄݼҌ൞၂ؓႄݼ֥ष൓֥ପ၂۱bᆺႵ҂ ᄝႄݼᇏࡗ֥׹ݼҌ൞ᆇᆞ֥׹ݼbᆃ৚૫Ⴕ෾؟֥༥ࢫླေᇿၩđбೂđਆ۱ႄݼॖ ିіൕֆ۱ႄݼđॖିіൕਆ۱ႄݼđߎႵॖିіൕॢğ "hello""hello", "","" ᆃ۱২ሰᇏđֻ၂۱თ൞ሳژԱ "hello"hello",ֻؽ۱თ൞ሳژԱ " """č္ࣼ൞၂۱ ॢϢࡆਆ۱ႄݼĎ đቋު၂۱თ൞၂۱ॢԱb
  157. Programming in Lua 155 Copyright ® 2005, Translation Team, www.luachina.net

    ໡ૌॖၛ؟ՑטႨ gsub টԩ৘ᆃུ౦ঃđ֌൞ؓႿᆃ۱಩ༀ൐ႨԮ๤֥࿖ߌčᄝૄ ۱თഈ࿖ߌĎটԩ৘۷Ⴕིb࿖ߌุ֥ᇶေ಩ༀ൞Ұᅳ༯၂۱׹ݼĠѩࡼთ֥ଽಸթ٢ ֞၂۱іᇏbؓႿૄ၂۱თđ໡ૌ࿖ߌҰᅳٿо֥ႄݼb࿖ߌଽ൐Ⴈଆൔ ' "("?) ' টҰ ᅳ၂۱თ֥ٿо֥ႄݼğೂݔ၂۱ႄݼު۵ሢ၂۱ႄݼđֻؽ۱ႄݼࡼФѽࠆѩڮ۳၂ ۱эਈ cđၩ໅ሢᆃಯಖ҂൞၂۱ٿо֥ႄݼ function fromCSV (s) s = s .. ',' -- ending comma local t = {} -- table to collect fields local fieldstart = 1 repeat -- next field is quoted? (start with `"'?) if string.find(s, '^"', fieldstart) then local a, c local i = fieldstart repeat -- find closing quote a, i, c = string.find(s, '"("?)', i+1) until c ~= '"' -- quote not followed by quote? if not i then error('unmatched "') end local f = string.sub(s, fieldstart+1, i-1) table.insert(t, (string.gsub(f, '""', '"'))) fieldstart = string.find(s, ',', i) + 1 else -- unquoted; find next comma local nexti = string.find(s, ',', fieldstart) table.insert(t, string.sub(s, fieldstart, nexti-1)) fieldstart = nexti + 1 end until fieldstart > string.len(s) return t end t = fromCSV('"hello "" hello", "",""') for i, s in ipairs(t) do print(i, s) end --> 1 hello " hello --> 2 "" --> 3
  158. Programming in Lua 157 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 21 ᅣ IO ९ I/O ९ູ໓ࡱҠቔิ܂ਆᇕଆൔbࡥֆଆൔčsimple modelĎႚႵ၂۱֒భൻೆ໓ࡱ ބ၂۱֒భൻԛ໓ࡱđѩ౏ิ܂ᆌؓᆃུ໓ࡱཌྷܱ֥Ҡቔbປಆଆൔčcomplete modelĎ ൐Ⴈຓ֥҆໓ࡱओѣটൌགྷb෱ၛ၂ᇕ૫ؓؓའ֥ྙൔđࡼ෮Ⴕ֥໓ࡱҠቔקၬູ໓ࡱ ओѣ֥ٚمbࡥֆଆൔᄝቓ၂ུࡥֆ֥໓ࡱҠቔൈࢠູކൡbᄝЧ඀֥భ૫҆ٳ໡ૌ၂ ᆰ׻ᄝ൐Ⴈ෱b֌൞ᄝࣉྛ၂ུ֥ۚࠩ໓ࡱҠቔ֥ൈީđࡥֆଆൔࣼཁ֤৯҂Ֆྏb২ ೂ๝ൈ؀౼؟۱໓ࡱᆃဢ֥Ҡቔđ൐ႨປಆଆൔᄵࢠູކൡbI/O ९֥෮Ⴕݦඔ׻٢ᄝ іčtableĎio ᇏb 2 21 1. .1 1 ࡥ ࡥֆ ֆ I I/ /O O ଆ ଆൔ ൔ ࡥֆଆൔ֥෮ႵҠቔ׻൞ᄝਆ۱֒భ໓ࡱᆭഈbI/O ९ࡼ֒భൻೆ໓ࡱቔູѓሙൻ ೆčstdinĎ đࡼ֒భൻԛ໓ࡱቔູѓሙൻԛčstdoutĎ bᆃဢ֒໡ૌᆳྛ io.readđࣼ൞ᄝѓ ሙൻೆᇏ؀౼၂ྛb໡ૌॖၛ൐Ⴈ io.input ބ io.output ݦඔটڿэ֒భ໓ࡱb২ೂ io.input(filename)ࣼ൞յष۳ק໓ࡱčၛ؀ଆൔĎ đѩࡼఃഡᇂູ֒భൻೆ໓ࡱbࢤ༯ট ෮Ⴕ֥ൻೆ׻টሱႿھ໓đᆰ֞ᄜՑ൐Ⴈ io.inputbio.output ݦඔbোරႿ io.inputb၂֊ Ӂളհ༂ਆ۱ݦඔ׻߶Ӂളհ༂b ೂݔ୆མᆰࢤ॥ᇅհ༂сྶ൐Ⴈປಆଆൔᇏ io.read ݦ ඔbཿҠቔࢠ؀Ҡቔࡥֆđ໡ૌ༵ՖཿҠቔೆ൭b༯૫ᆃ۱২ሰ৚ݦඔ io.write ࠆ౼಩ ၩඔଢ֥ሳژԱҕඔđࢤሢࡼ෱ૌཿ֞֒భ֥ൻԛ໓ࡱb๙ӈඔሳሇߐູሳژԱ൞οᅶ ๙ӈ֥ܿᄵđೂݔေ॥ᇅᆃ၂ሇߐđॖၛ൐Ⴈ string ९ᇏ֥ format ݦඔğ > io.write("sin (3) = ", math.sin(3), "\n") --> sin (3) = 0.1411200080598672 > io.write(string.format("sin (3) = %.4f\n", math.sin(3))) --> sin (3) = 0.1411 ᄝщཿս઒ൈႋ֒х૧ཞ io.write(a..b..c)Ġᆃဢ֥඀ཿđᆃ๝ io.write(a,b,c)ི֥ݔ൞ ၂ဢ֥b ֌൞ުᆀၹູх૧ਔԱ৳Ҡቔđ طཨݻࢠഒ֥ሧჷb ჰᄵഈ֒୆ࣉྛՙ੻ čquick and dirtyĎщӱđࠇᆀࣉྛஆհൈӈ൐Ⴈ print ݦඔb֒ླေປಆ॥ᇅൻԛൈ൐Ⴈ writeb > print("hello", "Lua"); print("Hi") --> hello Lua --> Hi > io.write("hello", "Lua"); io.write("Hi", "\n") --> helloLuaHi Write ݦඔა print ݦඔ҂๝ᄝႿđwrite ҂ڸࡆ಩ޅحຓ֥ሳژ֞ൻԛᇏಀđ২ೂᇅ
  159. Programming in Lua 158 Copyright ® 2005, Translation Team, www.luachina.net

    іژđߐྛژ֩֩bߎႵ write ݦඔ൞൐Ⴈ֒భൻԛ໓ࡱđط print ൓ᇔ൐Ⴈѓሙൻԛb ਸ਼ຓprintݦඔ߶ሱ׮טႨҕඔ֥tostringٚمđ ෮ၛॖၛཁൕԛі čtablesĎ ݦඔ čfunctionsĎ ބ nilb read ݦඔՖ֒భൻೆ໓ࡱ؀౼ԱđႮ෱֥ҕඔ॥ᇅ؀౼֥ଽಸğ "*all" ؀౼ᆜ۱໓ࡱ "*line" ؀౼༯၂ྛ "*number" ՖԱᇏሇߐԛ၂۱ඔᆴ num ؀౼ num ۱ሳژ֞Ա io.read("*all")ݦඔՖ֒భ໊ᇂ؀౼ᆜ۱ൻೆ໓ࡱbೂݔ֒భ໊ᇂᄝ໓ࡱଌແđࠇᆀ ໓ࡱູॢđݦඔࡼْ߭ॢԱbႮႿ Lua ؓӉԱো྘ᆴ֥Ⴕིܵ৘đᄝ Lua ᇏ൐Ⴈݖੲఖ ֥ࡥֆٚمࣼ൞؀౼ᆜ۱໓ࡱ֞Աᇏಀđԩ৘ປᆭުč২ೂ൐Ⴈݦඔ gsubĎ đࢤሢཿ֞ ൻԛᇏಀğ t = io.read("*all") -- read the whole file t = string.gsub(t, ...) -- do the job io.write(t) -- write the file ၛ༯ս઒൞၂۱ປᆜ֥ԩ৘ሳژԱ֥২ሰb໓ࡱ֥ଽಸေ൐Ⴈ MIMEč؟Ⴈ๯֥ຩ ࠽ႯࡱঔԉླྀၰĎᇏ֥ quoted-printable ઒ࣉྛщ઒bၛᆃᇕྙൔщ઒đ٤ ASCII ሳژࡼ Фщ઒ູo=XXp đఃᇏ XX ൞ھሳژᆴ֥൅ੂࣉᇅіൕđູіൕ၂ᇁྟo=pሳژ๝ဢ ေ౰Фڿཿbᄝ gsub ݦඔᇏ֥oଆൔpҕඔ֥ቔႨࣼ൞֤֞෮Ⴕᆴᄝ 128 ֞ 255 ᆭࡗ֥ ሳژđ۳෱ૌࡆഈ֩ݼѓᆽb t = io.read("*all") t = string.gsub(t, "([\128-\255=])", function (c) return string.format("=%02X", string.byte(c)) end) io.write(t) ھӱ྽ᄝХอ 333MHz ߌ࣢༯ሇߐ 200k ሳژླေ 0.2 ૰b io.read("*line")ݦඔْ߭֒భൻೆ໓ࡱ֥༯၂ྛč҂Їݣቋު֥ߐྛژĎ b֒֞ղ໓ ࡱଌແđْ߭ᆴູ nilčіൕીႵ༯၂ྛॖْ߭Ď bھ؀౼ٚൔ൞ read ݦඔ֥ଏಪٚൔđ ෮ၛॖၛࡥཿູ io.read()b๙ӈ൐Ⴈᆃᇕٚൔ؀౼໓ࡱ൞ႮႿؓ໓ࡱ֥Ҡቔ൞ሱಖᇯྛ ࣉྛ֥đڎᄵ۷ౠཟႿ൐Ⴈ*all ၂Ց؀౼ᆜ۱໓ࡱđࠇᆀ഍ު࡮֥֞ᇯॶ֥؀౼໓ࡱb ༯૫֥ӱ྽ဆൕਔႋೂޅ൐Ⴈھଆൔ؀౼໓ࡱbՎӱ྽گᇅ֒భൻೆ໓ࡱ֞ൻԛ໓ࡱđ ѩ࠺੣ྛඔb local count = 1 while true do local line = io.read() if line == nil then break end
  160. Programming in Lua 159 Copyright ® 2005, Translation Team, www.luachina.net

    io.write(string.format("%6d ", count), line, "\n") count = count + 1 end ಖطູਔᄝᆜ۱໓ࡱᇏᇯྛםսb ໡ૌቋݺ൐Ⴈ io.lines םսఖb ২ೂؓ໓ࡱ֥ྛࣉ ྛஆ྽֥ӱ྽ೂ༯ğ local lines = {} -- read the lines in table 'lines' for line in io.lines() do table.insert(lines, line) end -- sort table.sort(lines) -- write all the lines for i, l in ipairs(lines) do io.write(l, "\n") end ᄝХอ 333MHz ഈھӱ྽ԩ৘ԩ৘ 4.5MB նཬđ32K ྛ֥໓ࡱݻൈ 1.8 ૰đб൐Ⴈ ۚ؇Ⴊ߄֥ C ე࿽༢๤ஆ྽ӱ྽ॹ 0.6 ૰bio.read("*number")ݦඔՖ֒భൻೆ໓ࡱᇏ؀ ౼ԛ၂۱ඔᆴbᆺႵᄝھҕඔ༯ read ݦඔҌْ߭ඔᆴđط҂൞ሳژԱb֒ླေՖ၂۱໓ ࡱᇏ؀౼նਈඔሳൈđඔሳࡗ֥ሳژԱູॢϢॖၛཁᇷ֥ิۚᆳྛྟିb*number ࿊ཛ ߶๋ݖਆ۱ॖФ്љඔሳᆭࡗ֥಩ၩॢ۬bᆃུॖ്љ֥ሳژԱॖၛ൞-3a+5.2a1000đ ބ -3.4e-23b ೂݔᄝ֒భ໊ᇂᅳ҂֞၂۱ඔሳ čႮႿ۬ൔ҂ؓđ ࠇᆀ൞֞ਔ໓ࡱ֥ࢲແĎ đ ᄵْ߭ nil ॖၛؓૄ۱ҕඔഡᇂ࿊ཛđݦඔࡼْ߭۲ሱ֥ࢲݔbࡌೂႵ၂۱໓ࡱૄྛЇ ݣ೘۱ඔሳğ 6.0 -3.23 15e12 4.3 234 1000001 ... གྷᄝေյႆԛૄྛቋն֥၂۱ඔđ ࣼॖၛ൐Ⴈ၂Ց read ݦඔטႨট؀౼ԛૄྛ֥ಆ ҆೘۱ඔሳğ while true do local n1, n2, n3 = io.read("*number", "*number", "*number") if not n1 then break end print(math.max(n1, n2, n3)) end ᄝ಩ޅ౦ঃ༯đ׻ႋھॉ੮࿊ᄴ൐Ⴈ io.read ݦඔ֥ " *.all " ࿊ཛ؀౼ᆜ۱໓ࡱđಖ ު൐Ⴈ gfind ݦඔটٳࢳğ local pat = "(%S+)%s+(%S+)%s+(%S+)%s+" for n1, n2, n3 in string.gfind(io.read("*all"), pat) do
  161. Programming in Lua 160 Copyright ® 2005, Translation Team, www.luachina.net

    print(math.max(n1, n2, n3)) end ԢਔࠎЧ؀౼ٚൔຓđߎॖၛࡼඔᆴ n ቔູ read ݦඔ֥ҕඔbᄝᆃဢ֥౦ঃ༯ read ݦඔࡼӇ൫Ֆൻೆ໓ࡱᇏ؀౼ n ۱ሳژb ೂݔ໭م؀౼֞಩ޅሳژ čၘࣜ֞ਔ໓ࡱଌແĎ đ ݦඔْ߭ nilbڎᄵْ߭၂۱ቋ؟Їݣ n ۱ሳژ֥Աbၛ༯൞ܱႿھ read ݦඔҕඔ֥၂ ۱ࣉྛིۚ໓ࡱگᇅ֥২ሰӱ྽č֒ಖ൞ᆷᄝ Lua ᇏĎ local size = 2^13 -- good buffer size (8K) while true do local block = io.read(size) if not block then break end io.write(block) end หљ֥đio.read(0)ݦඔ֥ॖၛႨটҩ൫൞ڎ֞ղਔ໓ࡱଌແbೂݔ҂൞ْ߭၂۱ॢ Աđೂݔၘ൞໓ࡱଌແْ߭ nilb 2 21 1. .2 2 ປ ປಆ ಆ I I/ /O O ଆ ଆൔ ൔ ູਔؓൻೆൻԛ֥۷ಆ૫֥॥ᇅđॖၛ൐Ⴈປಆଆൔbປಆଆൔ֥ނྏᄝႿ໓ࡱओ ѣčfile handleĎ bھࢲܒোරႿ C ე࿽ᇏ֥໓ࡱੀčFILE*Ď đఃӯགྷਔ၂۱յष֥໓ࡱ ၛࠣ֒భթ౼໊ᇂbյष၂۱໓ࡱ֥ݦඔ൞ io.openb෱ଆٟ C ე࿽ᇏ֥ fopen ݦඔđ๝ ဢླေյष໓ࡱ֥໓ࡱ଀ҕඔđյषଆൔ֥ሳژԱҕඔbଆൔሳژԱॖၛ൞ "r"č؀ଆ ൔĎ đ"w"čཿଆൔđؓඔऌࣉྛڭۂĎ đࠇᆀ൞ "a"čڸࡆଆൔĎ bѩ౏ሳژ "b" ॖڸࡆ ᄝު૫іൕၛؽࣉᇅྙൔյष໓ࡱb ᆞӈ౦ঃ༯ open ݦඔْ߭၂۱໓ࡱ֥ओѣb ೂݔؿ ളհ༂đᄵْ߭ nilđၛࠣ၂۱հ༂ྐ༏ބհ༂ս઒b print(io.open("non-existent file", "r")) --> nil No such file or directory 2 print(io.open("/etc/passwd", "w")) --> nil Permission denied 13 հ༂ս઒֥קၬႮ༢๤थקb ၛ༯൞၂؍ׅ྘֥࡟Ұհ༂֥ս઒ğ local f = assert(io.open(filename, mode)) ೂݔ open ݦඔാϧđհ༂ྐ༏ቔູ assert ֥ҕඔđႮ assert ཁൕԛྐ༏b໓ࡱյष ުࣼॖၛႨ read ބ write ٚمؓ෰ૌࣉྛ؀ཿҠቔb෱ૌބ io і֥ read/write ݦඔোරđ ֌൞טႨٚمഈ҂๝đсྶ൐Ⴈવݼሳژđቔູ໓ࡱओѣ֥ٚمটטႨb২ೂյष၂۱ ໓ࡱѩಆ҆؀౼bॖၛ൐Ⴈೂ༯ս઒b
  162. Programming in Lua 161 Copyright ® 2005, Translation Team, www.luachina.net

    local f = assert(io.open(filename, "r")) local t = f:read("*all") f:close() ๝ C ე࿽ᇏ֥ੀ čstreamĎ ഡקোරđ I/O ९ิ܂೘ᇕყקၬ֥ओѣğ io.stdina io.stdout ބ io.stderrbၹՎॖၛႨೂ༯ս઒ᆰࢤؿෂྐ༏֞հ༂ੀčerror streamĎ b io.stderr:write(message) ໡ૌߎॖၛࡼປಆଆൔބࡥֆଆൔࠁކ൐Ⴈb൐ႨીႵ಩ޅҕඔ֥ io.input()ݦඔ֤ ֞֒భ֥ൻೆ໓ࡱओѣĠ൐ႨջႵҕඔ֥ io.input(handle)ݦඔഡᇂ֒భ֥ൻೆ໓ࡱູ handle ओѣսі֥ൻೆ໓ࡱb č๝ဢ֥ႨمؓႿ io.output ݦඔ္ൡႨĎ ২ೂေൌགྷᄠൈ֥ ڿэ֒భൻೆ໓ࡱđॖၛ൐Ⴈೂ༯ս઒ğ local temp = io.input() -- save current file io.input("newinput") -- open a new current file ... -- do something with new input io.input():close() -- close current file io.input(temp) -- restore previous current file 2 21 1. .2 2. .1 1 I I/ /O O Ⴊ Ⴊ߄ ߄֥ ֥၂ ၂۱ ۱ཬ ཬ࠯ ࠯ె ె ႮႿ๙ӈ Lua ᇏ؀౼ᆜ۱໓ࡱေб၂ྛ၂ྛ֥؀౼၂۱໓ࡱॹ֥؟b࣐ܵ໡ૌႵൈ ީᆌؓࢠն֥໓ࡱčࠫ൅đࠫϤᅸĎ đ҂ॖିϜ၂ՑϜ෱ૌ؀౼ԛটbေԩ৘ᆃဢ֥໓ࡱ ໡ૌಯಖॖၛ၂؍၂؍č২ೂ 8kb ၂؍Ď֥؀౼෱ૌb๝ൈູਔх૧్۩໓ࡱᇏ֥ྛđ ߎေᄝૄ؍ުࡆഈ၂ྛğ local lines, rest = f:read(BUFSIZE, "*line") ၛഈս઒ᇏ֥ rest ࣼЌթਔ಩ޅॖିФ؍߃ٳ్؎֥ྛbಖުᄜࡼ؍čchunkĎބྛ ࢤఏটbᆃဢૄ۱؍ࣼ൞ၛ၂۱ປᆜ֥ྛࢲແ֥ਔbၛ༯ս઒ࣼࢠູׅ྘֥൐Ⴈਔᆃ၂ ࠯ెbھ؍ӱ྽ൌགྷؓൻೆ໓ࡱ֥ሳژđֆՍđྛඔ֥࠹ඔb local BUFSIZE = 2^13 -- 8K local f = io.input(arg[1]) -- open input file local cc, lc, wc = 0, 0, 0 -- char, line, and word counts while true do local lines, rest = f:read(BUFSIZE, "*line") if not lines then break end if rest then lines = lines .. rest .. '\n' end cc = cc + string.len(lines) -- count words in the chunk
  163. Programming in Lua 162 Copyright ® 2005, Translation Team, www.luachina.net

    local _,t = string.gsub(lines, "%S+", "") wc = wc + t -- count newlines in the chunk _,t = string.gsub(lines, "\n", "\n") lc = lc + t end print(lc, wc, cc) 2 21 1. .2 2. .2 2 ؽ ؽࣉ ࣉᇅ ᇅ໓ ໓ࡱ ࡱ ଏಪ֥ࡥֆଆൔሹ൞ၛ໓Чଆൔյषbᄝ Unix ᇏؽࣉᇅ໓ࡱބ໓Ч໓ࡱѩીႵ౵ љđ֌൞ᄝೂ Windows ᆃဢ֥༢๤ᇏđؽࣉᇅ໓ࡱсྶၛཁൔ֥ѓ࠺টյष໓ࡱb॥ᇅ ᆃဢ֥ؽࣉᇅ໓ࡱđ୆сྶࡼobpѓ࠺เࡆᄝ io.open ݦඔ֥۬ൔሳژԱҕඔᇏbᄝ Lua ᇏؽࣉᇅ໓ࡱ֥॥ᇅބ໓Чোරb၂۱ԱॖၛЇݣ಩ޅሳࢫᆴđ९ᇏࠫެ෮Ⴕ֥ݦඔ׻ ॖၛႨটԩ৘಩ၩሳࢫᆴb č୆മᇀॖၛؓؽࣉᇅ֥oԱpࣉྛଆൔбࢠđᆺေԱᇏ҂թ ᄝ 0 ᆴbೂݔམေࣉྛ 0 ᆴሳࢫ֥௄஥đ୆ॖၛ൐Ⴈ%z սูĎᆃဢ൐Ⴈ*all ଆൔࣼ൞؀ ౼ᆜ۱໓ࡱ֥ᆴđ൐Ⴈඔሳ n ࣼ൞؀౼ n ۱ሳࢫ֥ᆴbၛ༯൞၂۱ࡼ໓Ч໓ࡱՖ DOS ଆൔሇߐ֞ Unix ଆൔ֥ࡥֆӱ྽b čᆃဢሇߐݖӱࣼ൞ࡼo߭ӚߐྛሳژpูߐӮoߐ ྛሳژp b Ďၹູ൞ၛؽࣉᇅྙൔčჰ۠൞ Text ModeĆ ĆĤĤĎյषᆃུ໓ࡱ֥đᆃ৚໭ م൐Ⴈѓሙൻೆൻೆ໓ࡱčstdin/stdoutĎ b෮ၛ൐Ⴈӱ྽ᇏิ܂֥ҕඔট֤֞ൻೆaൻԛ ໓ࡱ଀b local inp = assert(io.open(arg[1], "rb")) local out = assert(io.open(arg[2], "wb")) local data = inp:read("*all") data = string.gsub(data, "\r\n", "\n") out:write(data) assert(out:close()) ॖၛ൐Ⴈೂ༯֥ଁ਷ྛটטႨھӱ྽b > lua prog.lua file.dos file.unix ֻؽ۱২ሰӱ྽ğյႆᄝؽࣉᇅ໓ࡱᇏᅳ֥֞෮ႵหקሳژԱbھӱ྽קၬਔ၂ᇕ ቋഒႚႵੂ۱oႵིሳژp đၛਬሳࢫᆴࢲແ֥หקԱb čЧӱ྽ᇏoႵིሳژpקၬູ ໓Чඔሳaѓׄژݼބॢ۬ژđႮэਈ validchars קၬb Ďᄝӱ྽ᇏ໡ૌ൐Ⴈ৵ࢤބ string.rep ݦඔԷࡹ validcharsđၛ%z ࢲແট௄஥Ա֥ਬࢲແb local f = assert(io.open(arg[1], "rb"))
  164. Programming in Lua 163 Copyright ® 2005, Translation Team, www.luachina.net

    local data = f:read("*all") local validchars = "[%w%p%s]" local pattern = string.rep(validchars, 6) .. "+%z" for w in string.gfind(data, pattern) do print(w) end ቋު၂۱২ሰğھӱ྽ؓؽࣉᇅ໓ࡱࣉྛ၂Ցᆴٳ༅4čDumpĎ bӱ྽ֻ֥၂۱ҕඔ ൞ൻೆ໓ࡱ଀đൻԛູѓሙൻԛbఃοᅶ 10 ሳࢫູ၂؍؀౼໓ࡱđࡼૄ၂؍۲ሳࢫ֥൅ ੂࣉᇅіൕཁൕԛটbࢤሢᄜၛ໓Ч֥ྙൔཿԛھ؍đѩࡼ॥ᇅሳژሇߐູׄݼb local f = assert(io.open(arg[1], "rb")) local block = 10 while true do local bytes = f:read(block) if not bytes then break end for b in string.gfind(bytes, ".") do io.write(string.format("%02X ", string.byte(b))) end io.write(string.rep(" ", block - string.len(bytes) + 1)) io.write(string.gsub(bytes, "%c", "."), "\n") end ೂݔၛ vip টଁ଀ھӱ྽࢖Ч໓ࡱbॖၛ൐Ⴈೂ༯ଁ਷টᆳྛھӱ྽ԩ৘ఃሱദğ prompt> lua vip vip ᄝ Unix ༢๤ᇏ෱ࡼ߶߶Ӂള၂۱ೂ༯֥ൻԛဢൔğ 6C 6F 63 61 6C 20 66 20 3D 20 local f = 61 73 73 65 72 74 28 69 6F 2E assert(io. 6F 70 65 6E 28 61 72 67 5B 31 open(arg[1 5D 2C 20 22 72 62 22 29 29 0A ], "rb")). ... 22 25 63 22 2C 20 22 2E 22 29 "%c", ".") 2C 20 22 5C 6E 22 29 0A 65 6E , "\n").en 64 0A d. 2 21 1. .3 3 ܱ ܱႿ Ⴟ໓ ໓ࡱ ࡱ֥ ֥ః ః෱ ෱Ҡ Ҡቔ ቔ ݦඔ tmpfile ݦඔႨটْ߭ਬൈ໓ࡱ֥ओѣđѩ౏ఃյषଆൔູ read/write ଆൔbھ 4 ၲᇿğ֤֞োරႿ൅ੂࣉᇅщࠠఖ֥၂۱ࢸ૫ཁൕ
  165. Programming in Lua 164 Copyright ® 2005, Translation Team, www.luachina.net

    ਬൈ໓ࡱᄝӱ྽ᆳྛປު߶ሱ׮ࣉྛౢԢb ݦඔ flush ႨটႋႨᆌؓ໓ࡱ֥෮Ⴕྩڿb ๝ write ݦඔ၂ဢđ ھݦඔ֥טႨ࠻ॖၛοݦඔטႨ֥ٚم൐Ⴈ io.flush()টႋႨ֒భൻԛ໓ ࡱĠ္ॖၛο໓ࡱओѣٚم֥ဢൔ f:flush()টႋႨ໓ࡱ fbݦඔ seek Ⴈট֤֞ބഡᇂ၂۱ ໓ࡱ֥֒భթ౼໊ᇂb෱֥၂Ϯྙൔູ filehandle:seek(whence,offset)bWhence ҕඔ൞၂ ۱іൕொ၍ٚൔ֥ሳژԱb෱ॖၛ൞ "set"đொ၍ᆴ൞Ֆ໓ࡱ๨ष൓Ġ"cur"đொ၍ᆴՖ ֒భ໊ᇂष൓Ġ"end"đொ၍ᆴՖ໓ࡱແສభ࠹ඔboffset ູࠧொ၍֥ඔᆴđႮ whence ֥ ᆴބ offset ཌྷࢲކ֤֞ྍ֥໓ࡱ؀౼໊ᇂbھ໊ᇂ൞ൌ࠽Ֆ໓ࡱष๨࠹ඔ֥ሳࢫඔb whence ֥ଏಪᆴູ "cur"đ offset ֥ଏಪᆴູ 0b ᆃဢטႨ file:seek()ْ֤֥֞߭ᆴࣼ൞໓ ࡱ֒భ֥թ౼໊ᇂđ ౏Ќӻ҂эb file:seek("set")ࣼ൞ࡼ໓ࡱ֥թ౼໊ᇂᇗഡ֞໓ࡱष๨b čْ߭ᆴ֒ಖࣼ൞ 0Ď bط file:seek("end")ࣼ൞ࡼ໊ᇂഡູ໓ࡱແđ๝ൈࣼॖၛ֤֞໓ࡱ ֥նཬbೂ༯֥ս઒ൌགྷਔ֤֞໓ࡱ֥նཬط҂ڿэթ౼໊ᇂb function fsize (file) local current = file:seek() -- get current position local size = file:seek("end") -- get file size file:seek("set", current) -- restore position return size end ၛഈ֥ࠫ۱ݦඔᄝԛհൈ׻ࡼْ߭၂۱Їݣਔհ༂ྐ༏֥ nil ᆴb
  166. Programming in Lua 165 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 22 ᅣ Ҡቔ༢๤९ Ҡቔ༢๤९Їݣਔ໓ࡱܵ৘đ༢๤ൈᇒ֩֩აҠቔ༢๤ཌྷܱྐ༏bᆃུݦඔקၬᄝ іčtableĎos ᇏbקၬھ९ൈॉ੮֞ Lua ֥ॖ၍ᆱྟđၹູ Lua ൞ၛ ANSI C ཿӮ֥đ ෮ၛᆺି൐Ⴈ ANSI קၬ֥၂ུѓሙݦඔbྸ؟֥༢๤උྟѩ҂Їݣᄝ ANSI קၬᇏđ ২ೂଢ੣ܵ৘đสࢤሳ֩֩b෮ၛᄝ༢๤९৚ѩીႵิ܂ᆃུۿିbਸ਼ຓႵ၂ུીႵЇ ݣᄝᇶุؿྛϱᇏ֥ Lua ९ิ܂ਔҠቔ༢๤ঔᅚඋྟ֥٠໙b২ೂ posix ९đิ܂ਔؓ POSIX 1 ѓሙ֥ປಆᆦӻĠᄝбೂ luasocket ९đิ܂ਔຩ઎ᆦӻb ᄝ໓ࡱܵ৘ٚ૫Ҡቔ༢๤९ࣼิ܂ਔ os.rename ݦඔčྩڿ໓ࡱ଀Ďބ os.remove ݦ ඔč೷Ԣ໓ࡱĎ b 2 22 2. .1 1 D Da at te e ބ ބ T Ti im me e time ބ date ਆ۱ݦඔᄝ Lua ᇏൌགྷ෮Ⴕ֥ൈᇒҰ࿘ۿିbݦඔ time ᄝીႵҕඔൈ ْ߭֒భൈᇒ֥ඔᆴb čᄝྸ؟༢๤ᇏھඔᆴ൞֒భए৖ଖ۱หקൈࡗ֥૰ඔb Ďູ֒ݦ ඔטႨڸࡆ၂۱ห൹֥ൈࡗіൈđھݦඔࣼ൞ْ߭एھі૭ඍ֥ൈࡗ֥ඔᆴbᆃဢ֥ൈ ࡗіႵೂ༯֥౵ࡗğ year a full year month 01-12 day 01-31 hour 01-31 min 00-59 sec 00-59 isdst a boolean, true if daylight saving భ೘ཛ൞сླ֥đೂݔໃקၬުࠫཛđଏಪൈࡗູᆞ໶č12:00:00Ď bೂݔ൞ᄝ৚ჿ ಣଽ੓č۬ਟຯᇍཟ༆೘۱ൈ౵Ď֥၂෻ Unix ࠹ෘࠏഈčཌྷؓൈࡗູ 1970 ୍ 1 ᄅ 1 ರđ 00:00:00Ďᆳྛೂ༯ս઒đఃࢲݔࡼೂ༯b -- obs: 10800 = 3*60*60 (3 hours) print(os.time{year=1970, month=1, day=1, hour=0}) --> 10800 print(os.time{year=1970, month=1, day=1, hour=0, sec=1}) --> 10801 print(os.time{year=1970, month=1, day=1}) --> 54000 (obs: 54000 = 10800 + 12*60*60)
  167. Programming in Lua 166 Copyright ® 2005, Translation Team, www.luachina.net

    ݦඔ datađ҂ܵ෱֥଀ሳ൞൉હđఃൌ൞ time ݦඔ֥၂ᇕoّݦඔp b෱ࡼ၂۱і ൕರ௹ބൈࡗ֥ඔᆴđሇߐӮ۷֥ۚࠩіགྷྙൔbఃֻ၂۱ҕඔ൞၂۱۬ൔ߄ሳژԱđ ૭ඍਔေْ֥߭ൈࡗྙൔbֻؽ۱ҕඔࣼ൞ൈࡗ֥ඔሳіൕđଏಪູ֒భ֥ൈࡗb൐Ⴈ ۬ൔሳژ "*t"đԷࡹ၂۱ൈࡗіb২ೂ༯૫ᆃ؍ս઒ğ temp = os.date("*t", 906000490) ᄵ߶Ӂളі {year = 1998, month = 9, day = 16, yday = 259, wday = 4, hour = 23, min = 48, sec = 10, isdst = false} ҂଴ؿགྷھіᇏԢਔ൐Ⴈ֞ਔᄝഈඍൈࡗіᇏ֥౵თၛຓđᆃ۱іߎิ܂ਔྒ௹ čwdayđྒ௹฿ູ 1Ďބ၂୍ᇏֻ֥ࠫ฿čydayđ၂ᄅ၂ರູ 1ĎԢਔ൐Ⴈ "*t" ۬ൔሳ ژԱຓđೂݔ൐Ⴈջѓ࠺č࡮༯іĎ֥ห൹ሳژԱđos.data ݦඔ߶ࡼཌྷႋ֥ѓ࠺໊ၛൈ ࡗྐ༏ࣉྛแԉđ֤֞၂۱Їݣൈࡗ֥ሳژԱb čᆃུห൹ѓ࠺׻൞ၛ "%" ބ၂۱ሳଛ ֥ྙൔԛགྷĎೂ༯ğ print(os.date("today is %A, in %B")) --> today is Tuesday, in May print(os.date("%x", 906000490)) --> 09/16/1998 ᆃུൈࡗൻԛ֥ሳژԱіൕ൞ࣜݖЧֹ߄֥b෮ၛೂݔ൞ᄝϘ༆č௮ฤ࿩ე༢Ď đ "%B" ֤֥֞ࣼ൞ "setembro"čၲᆀοğնۀ൞௮ฤ࿩ეࣴᄅĤĎ đ"%x" ֤֥֞ࣼ൞ "16/09/98"čᄅರՑ྽҂๝Ď bѓ࠺֥ၩၬބཁൕൌ২ሹࢲೂ༯іbൌ২֥ൈࡗ൞ᄝ 1998 ୍ࣴᄅ 16 ರđྒ௹೘đ23:48:10bْ߭ᆴູඔሳྙൔ֥ߎਙԛਔ෱ૌ֥ٓຶb č׻൞ο ᅶႇე༢֥ཁൕ૭ඍ֥đ္бࢠࡥֆđࣼ҂ِਔĎ %a abbreviated weekday name (e.g., Wed) %A full weekday name (e.g., Wednesday) %b abbreviated month name (e.g., Sep) %B full month name (e.g., September) %c date and time (e.g., 09/16/98 23:48:10) %d day of the month (16) [01-31] %H hour, using a 24-hour clock (23) [00-23] %I hour, using a 12-hour clock (11) [01-12] %M minute (48) [00-59] %m month (09) [01-12] %p either "am" or "pm" (pm) %S second (10) [00-61] %w weekday (3) [0-6 = Sunday-Saturday] %x date (e.g., 09/16/98) %X time (e.g., 23:48:10)
  168. Programming in Lua 167 Copyright ® 2005, Translation Team, www.luachina.net

    %Y full year (1998) %y two-digit year (98) [00-99] %% the character '%' ൙ൌഈೂݔ҂൐Ⴈ಩ޅҕඔࣼטႨ dateđ ࣼ൞ၛ%c ֥ྙൔൻԛb ᆃဢࣼ൞֤֞ࣜݖ ۬ൔ߄֥ປᆜൈࡗྐ༏bߎေᇿၩ%xa%X ބ%c Ⴎ෮ᄝֹ౵ބ࠹ෘࠏ༢๤֥ڿэ߶ؿ ളэ߄bೂݔھሳژԱေಒק༯টč২ೂಒקູ mm/dd/yyyyĎ đॖၛ൐Ⴈૼಒ֥ሳژԱ ۬ൔٚൔč২ೂ"%m/%d/%Y"Ď b ݦඔ os.clock ْ߭ᆳྛھӱ྽ CPU ޽ಀ֥ൈᇒ૰ඔbھݦඔӈႨটҩ൫၂؍ս઒b local x = os.clock() local s = 0 for i=1,100000 do s = s + i end print(string.format("elapsed time: %.2f\n", os.clock() - x)) 2 22 2. .2 2 ః ః෱ ෱֥ ֥༢ ༢๤ ๤ט טႨ Ⴈ ݦඔ os.exit ᇔᆸ၂۱ӱ྽֥ᆳྛbݦඔ os.getenv ֤֞oߌ࣢эਈp֥ᆴbၛoэਈ ଀pቔູҕඔđْ߭ھэਈᆴ֥ሳژԱğ print(os.getenv("HOME")) --> /home/lua ೂݔીႵھߌ࣢эਈᄵْ߭ nilb ݦඔ os.execute ᆳྛ၂۱༢๤ଁ਷ čބ C ᇏ֥ system ݦඔ֩ࡎĎ bھݦඔࠆ౼၂۱ଁ਷ሳژԱđْ߭၂۱հ༂ս઒b২ೂᄝ Unix ބ DOS-Windows ༢๤৚׻ॖၛᆳྛೂ༯ս઒Էࡹ၂۱ྍଢ੣ğ function createDir (dirname) os.execute("mkdir " .. dirname) end os.execute ݦඔࢠ఼ູնđ๝ൈ္۷ࡆၗঠႿ࠹ෘࠏ༢๤bݦඔ os.setlocale ഡק Lua ӱ྽෮൐Ⴈ֥౵თčlocaleĎ b౵თקၬ֥э߄ؓႿ໓߄ބე࿽൞ཌྷ֒ૹۋ֥bsetlocale Ⴕਆ۱ሳژԱҕඔğ౵თ଀ބหྟčcategoryđႨটіൕ౵თ֥۲ཛหྟĎ bᄝ౵თᇏЇ ݣੂཛหྟğ ocollatep čஆ྽Ď ॥ᇅሳژ֥ஆਙඨ྽Ġ "ctype" controls the types of individual characters (e.g., what is a letter) and the conversion between lower and upper cases; "monetary"čࠊлĎؓ Lua ӱ྽ીႵ႕ཙĠ"numeric"čඔሳĎ॥ᇅඔሳ֥۬ൔĠ"time" ॥ᇅൈࡗ֥۬ൔč္ࣼ൞ os.date ݦඔĎ ĠބoallpЇݣၛഈ෮ၛหྟbݦඔଏಪ֥หྟ ࣼ൞ oallp đ ෮ၛೂݔ୆ᆺЇݣֹთ଀ࣼטႨݦඔ setlocale ପહ෮Ⴕ֥หྟ׻߶Фڿэູ ྍ֥౵თหྟbೂݔᄎྛӮۿݦඔֹْ߭თ଀đڎᄵْ߭ nilč๙ӈၹູ༢๤҂ᆦӻ۳ק ֥౵თĎ b print(os.setlocale("ISO-8859-1", "collate")) --> ISO-8859-1 ܱႿonumericpหྟႵ၂ׄ଴ԩ৘ֹ֥ٚb࣐ܵ௮ฤ࿩ეބః෱֥၂ུঘנ໓ე࿽
  169. Programming in Lua 168 Copyright ® 2005, Translation Team, www.luachina.net

    ൐Ⴈ׹ݼսูׄݼটіൕ൅ࣉᇅඔđ֌൞౵თഡᇂѩ҂߶ڿэLua߃ٳඔሳ֥ٚൔb čԢ ਔః෱၂ུჰၹᆭຓđႮႿprintč3,4ĎߎႵః෱֥ݦඔၩၬb ĎၹՎഡᇂᆭު֤֥֞༢ ๤္ྸ࠻҂ି്љջ׹ݼ֥ඔᆴđႻ҂ି৘ࢳջׄݼ֥ඔᆴ5ğ -- ഡᇂ౵თູ௮ฤ࿩ე༢Ϙ༆ print(os.setlocale('pt_BR')) --> pt_BR print(3,4) --> 3 4 print(3.4) --> stdin:1: malformed number near `3.4' The category "numeric" is a little tricky. Although Portuguese and other Latin languages use a comma instead of a point to represent decimal numbers, the locale does not change the way that Lua parses numbers (among other reasons because expressions like print(3,4) already have a meaning in Lua). Therefore, you may end with a system that cannot recognize numbers with commas, but cannot understand numbers with points either: -- set locale for Portuguese-Brazil print(os.setlocale('pt_BR')) --> pt_BR print(3,4) --> 3 4 print(3.4) --> stdin:1: malformed number near '3.4' 5 ၲᆀοğݺཞ൞Ϙ༆ದِ֥ସđ҂മࢳbڸჰ໓b
  170. Programming in Lua 169 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 23 ᅣ Debug ९ debug ९ѩ҂۳୆၂۱ॖႨ֥ Lua ט൫ఖđط൞۳୆ิ܂၂ູུ Lua ཿ၂۱ט൫ఖ ֥ٚьbԛႿྟିٚ૫֥ॉ੮đܱႿᆃٚ૫֥ܲٚࢤ१൞๙ݖ C API ൌགྷ֥bLua ᇏ֥ debug ९ࣼ൞၂ᇕᄝ Lua ս઒ᇏᆰࢤ٠໙ᆃུ C ݦඔ֥ٚمbDebug ९ᄝ၂۱ debug і ଽലૼਔ෰෮Ⴕ֥ݦඔb აః෰֥ѓሙ९҂๝֥൞đ୆ႋھ࣐ॖିഒ֥൞Ⴕ debug ९b൮༵đdebug ९ᇏ֥ ၂ུݦඔྟିбࢠ֮Ġֻؽđ෱௥ߊਔე࿽֥၂ུᆇ৘(sacred truths)đбೂ୆҂ିᄝק ၬ၂۱अ҆эਈ֥ݦඔຓ҆đ٠໙ᆃ۱эਈb๙ӈđᄝ୆֥ቋᇔӁ௖ᇏđ୆҂མյषᆃ ۱ debug ९đࠇᆀ୆ॖିམ೷Ԣᆃ۱९ğ debug = nil debug ९ႮਆᇕݦඔቆӮğሱസ(introspective)ݦඔބ hooksbሱസݦඔ൐֤໡ૌॖၛ ࡟Ұᄎྛӱ྽֥ଖུٚ૫đбೂࠃ׮ݦඔᅜa֒భᆳྛս઒֥ྛݼaЧֹэਈ֥଀ބᆴb Hooks ॖၛ۵ሶӱ྽֥ᆳྛ౦ঃb Debug ९ᇏ֥၂۱ᇗေ֥නམ൞ᅜࠩљ(stack level)b၂۱ᅜࠩљࣼ൞၂۱ᆷཟᄝ֒ భൈख़ᆞᄝࠃ׮֥ห൹ݦඔ֥ඔሳđ္ࣼ൞ඪđᆃ۱ݦඔᆞᄝФטႨ֌ߎીႵْ߭bט Ⴈ debug ९֥ݦඔࠩљູ 1đטႨ෰(෰ᆷטႨ debug ९֥ݦඔ)֥ݦඔࠩљູ 2đၛՎো ๷b 2 23 3. .1 1 ሱ ሱസ സč čI In nt tr ro os sp pe ec ct ti iv ve eĎ Ď ᄝ debug ९ᇏᇶေ֥ሱസݦඔ൞ debug.getinfob෰ֻ֥၂۱ҕඔॖၛ൞၂۱ݦඔࠇ ᆀᅜࠩљbؓႿݦඔ foo טႨ debug.getinfo(foo)đࡼْܱ߭Ⴟᆃ۱ݦඔྐ༏֥၂۱іb ᆃ۱іႵ༯ਙ၂ུთğ sourceđѓૼݦඔФקၬֹ֥ٚbೂݔݦඔᄝ၂۱ሳژԱଽФקၬč๙ݖ loadstringĎ đsource ࣼ൞ପ۱ሳژԱbೂݔݦඔᄝ၂۱໓ࡱᇏקၬđsource ൞@ ࡆഈ໓ࡱ଀b short_srcđsource ֥ࡥ؋ϱЧčቋ؟ 60 ۱ሳژĎ đ࠺੣၂ུႵႨ֥հ༂ྐ༏b linedefinedđsource ᇏݦඔФקၬᆭԩ֥ྛݼb whatđѓૼݦඔো྘bೂݔ foo ൞၂۱௴๙֤ Lua ݦඔđࢲݔູ "Lua"Ġೂݔ ൞၂۱ C ݦඔđࢲݔູ "C"Ġೂݔ൞၂۱ Lua ֥ᇶ chunkđࢲݔູ "main"b nameđݦඔ֥ކ৘଀ӫb namewhatđ ഈ၂۱ሳ؍սі֥ݣၬb ᆃ۱ሳ؍֥౼ᆴॖିູğ W"global"a "local"a
  171. Programming in Lua 170 Copyright ® 2005, Translation Team, www.luachina.net

    "method"a"field"đࠇᆀ ""čॢሳژԱĎ bॢሳژԱၩ໅ሢ Lua ીႵᅳ֞ᆃ۱ݦ ඔ଀b nupsđݦඔ֥ upvalues ֥۱ඔb funcđݦඔЧദĠབྷ༥౦ঃुު૫b ֒ foo ൞၂۱ C ݦඔ֥ൈީđLua ໭مᆩ֡ޓ؟ཌྷܱ֥ྐ༏đ෮ၛؓᆃᇕݦඔđᆺ Ⴕ whatanameanamewhat ᆃࠫ۱თ֥ᆴॖႨb ၛඔሳ n טႨ debug.getinfo(n)ൈđْ߭ᄝ n ࠩᅜ֥ࠃ׮ݦඔ֥ྐ༏ඔऌbбೂđೂ ݔ n=1đْ֥߭൞ᆞᄝࣉྛטႨ֥ପ۱ݦඔ֥ྐ༏b čn=0 іൕ C ݦඔ getinfo ЧദĎೂ ݔ n бᅜᇏࠃ׮ݦඔ֥۱ඔն֥߅đdebug.getinfo ْ߭ nilb֒୆൐Ⴈඔሳ n טႨ debug.getinfo Ұ࿘ࠃ׮ݦඔ֥ྐ༏֥ൈީđْ֥߭ࢲݔ table ᇏႵ၂۱حຓ֥თğ currentlineđࠧᄝପ۱ൈख़ݦඔ෮ᄝ֥ྛݼbਸ਼ຓđfunc іൕᆷק n ֥ࠩࠃ׮ݦඔb ሳ؍଀֥ཿمႵུ࠯ెb࠺ᇾğၹູᄝ Lua ᇏݦඔ൞ֻ၂োᆴđ෮ၛ၂۱ݦඔॖି Ⴕ؟۱ݦඔ଀bҰᅳᆷקᆴ֥ݦඔ֥ൈީđLua ߶൮༵ᄝಆअэਈᇏҰᅳđೂݔીᅳ֞ Ҍ߶֞טႨᆃ۱ݦඔ֥ս઒ᇏु෱൞ೂޅФטႨ֥bު૫ᆃᇕ౦ঃᆺႵᄝ໡ૌ൐Ⴈඔሳ טႨ getinfo ֥ൈީҌ߶ఏቔႨđ္ࣼ൞ᆃ۱ൈީ໡ૌିܔࠆ౼טႨཌྷܱ֥བྷ༥ྐ༏b ݦඔgetinfo ི֥ੱѩ҂ۚb Lua ၛ҂ཨ೐ӱ྽ᆳྛ֥ٚൔЌթdebug ྐ༏ čLua keeps debug information in a form that does not impair program executionĎ đིੱФ٢ᄝֻؽ໊b ູਔࠆ౼бࢠݺֹᆳྛྟିđgetinfo ॖ࿊ֻ֥ؽ۱ҕඔॖၛႨটᆷק࿊౼ଧུྐ༏bᆷ קਔᆃ۱ҕඔᆭުđӱ྽҂߶শٮൈࡗಀ൬ࠢପུႨ޼҂ܱྏ֥ྐ༏bᆃ۱ҕඔ֥۬ൔ ൞၂۱ሳژԱđૄ၂۱ሳଛսі၂ᇕো྘֥ྐ༏đॖႨ֥ሳଛ֥ݣၬೂ༯ğ 'n' selects fields name and namewhat 'f' selects field func 'S' selects fields source, short_src, what, and linedefined 'l' selects field currentline 'u' selects field nup ༯૫֥ݦඔӂૼਔ debug.getinfo ֥൐Ⴈđݦඔյႆ၂۱ࠃ׮ᅜ֥ჰ൓۵ሶྐ༏ čtracebackĎ ğ function traceback () local level = 1 while true do local info = debug.getinfo(level, "Sl") if not info then break end if info.what == "C" then -- is a C function? print(level, "C function") else -- a Lua function print(string.format("[%s]:%d", info.short_src, info.currentline))
  172. Programming in Lua 171 Copyright ® 2005, Translation Team, www.luachina.net

    end level = level + 1 end end ҂଴ڿࣉᆃ۱ݦඔđ൐֤ getinfo ࠆ౼۷؟֥ඔऌđൌ࠽ഈ debug ९ิ܂ਔ၂۱ڿ೿ ֥ϱЧ debug.tracebackđა໡ૌഈ૫֥ݦඔ҂๝֥൞đdebug.traceback ѩ҂յႆࢲݔđ ط൞ْ߭၂۱ሳژԱb 2 23 3. .1 1. .1 1 ٠ ٠໙ ໙अ अ҆ ҆э эਈ ਈ טႨ debug ९֥ getlocal ݦඔॖၛ٠໙಩ޅࠃ׮ሑ෿֥अ҆эਈbᆃ۱ݦඔႮਆ۱ ҕඔğࡼေҰ࿘֥ݦඔ֥ᅜࠩљބэਈ֥෬ႄbݦඔႵਆ۱ْ߭ᆴğэਈ଀ބэਈ֒భ ᆴbೂݔᆷק֥эਈ֥෬ႄնႿࠃ׮эਈ۱ඔđgetlocal ْ߭ nilbೂݔᆷק֥ᅜࠩљ໭ ིđݦඔ߶஘ԛհ༂b č୆ॖၛ൐Ⴈ debug.getinfo ࡟Ұᅜࠩљ֥ႵིྟĎ Lua ؓݦඔᇏ෮ԛགྷ֥෮Ⴕअ҆эਈ၇Ց࠹ඔđᆺႵᄝ֒భݦඔ֥ٓຶଽ൞Ⴕི֥ अ҆эਈҌ߶Ф࠹ඔbбೂđ༯૫֥ս઒ function foo (a,b) local x do local c = a - b end local a = 1 while true do local name, value = debug.getlocal(1, a) if not name then break end print(name, value) a = a + 1 end end foo(10, 20) ࢲݔູğ a 10 b 20 x nil a 4 ෬ႄູ 1 ֥эਈ൞ ađ2 ൞ bđ3 ൞ xđ4 ൞ਸ਼၂۱ abᄝ getlocal ФטႨ֥ପ၂ׄđc ၘࣜӑԛਔٓຶđname ބ value ׻҂ᄝٓຶଽb č࠺ᇾğअ҆эਈࣇࣇᄝ෰ૌФԚ൓߄ ᆭުҌॖ࡮Ď္ॖၛ൐Ⴈ debug.setlocal ྩڿ၂۱अ҆эਈ֥ᆴđ෰֥భਆ۱ҕඔ൞ᅜࠩ
  173. Programming in Lua 172 Copyright ® 2005, Translation Team, www.luachina.net

    љބэਈ෬ႄđֻ೘۱ҕඔ൞эਈ֥ྍᆴbᆃ۱ݦඔْ߭၂۱эਈ଀ࠇᆀ nilčೂݔэਈ ෬ႄӑԛٓຶĎ 2 23 3. .1 1. .2 2 ٠ ٠໙ ໙ U Up pv va al lu ue es s ໡ૌ္ॖၛ๙ݖ debug ९֥ getupvalue ݦඔ٠໙ Lua ݦඔ֥ upvaluesbބअ҆эਈ ҂๝֥൞đ ࠧ൐ݦඔ҂ᄝࠃ׮ሑ෿෰၇ಖႵ upvalues čᆃ္ࣼ൞оЇ֥ၩၬ෮ᄝĎ b ෮ၛđ getupvalue ֻ֥၂۱ҕඔ҂൞ᅜࠩљط൞၂۱ݦඔčࣚಒ֥ඪႋھ൞၂۱оЇĎ đֻؽ۱ ҕඔ൞ upvalue ֥෬ႄbLua οᅶ upvalue ᄝ၂۱ݦඔᇏФႄႨ(refer)֥ඨ྽၇Ցщݼđ ၹູ၂۱ݦඔ҂ିႵਆ۱ཌྷ๝଀ሳ֥ upvaluesđ෮ၛᆃ۱ඨ྽ބ upvalue ѩી൉હܱ৳ črelevantĎ b ॖၛ൐Ⴈݦඔ ebug.setupvalue ྩڿ upvaluesb္ྸ୆ၘࣜ҉֞đ෰Ⴕ೘۱ҕඔğ၂ ۱оЇđ ၂۱ upvalues ෬ႄބ၂۱ྍ֥ upvalue ᆴb ބ setlocal োරđ ᆃ۱ݦඔْ߭ upvalue ֥଀ሳđࠇᆀ nilčೂݔ upvalue ෬ႄӑԛ෬ႄٓຶĎ b ༯૫֥ս઒ཁൕਔđᄝ۳קэਈ଀֥౦ঃ༯đೂޅ٠໙၂۱ᆞᄝטႨ֥ݦඔ֥಩ၩ ֥۳קэਈ֥ᆴğ function getvarvalue (name) local value, found -- try local variables local i = 1 while true do local n, v = debug.getlocal(2, i) if not n then break end if n == name then value = v found = true end i = i + 1 end if found then return value end -- try upvalues local func = debug.getinfo(2).func i = 1 while true do local n, v = debug.getupvalue(func, i) if not n then break end
  174. Programming in Lua 173 Copyright ® 2005, Translation Team, www.luachina.net

    if n == name then return v end i = i + 1 end -- not found; get global return getfenv(func)[name] end ൮༵đ໡ૌӇ൫ᆃ۱эਈ൞ڎູअ҆эਈğೂݔؓႿ۳ק଀ሳ֥эਈႵ؟۱эਈđ ໡ૌсྶ٠໙ऎႵቋۚ෬ႄ֥ପ၂۱đ෮ၛ໡ૌሹ൞ླေђ৥ᆜ۱࿖ߌbೂݔᄝअ҆э ਈᇏᅳ҂֞ᆷק଀ሳ֥эਈđ໡ૌӇ൫ᆃ۱эਈ൞ڎູ upvaluesğ൮༵đ໡ૌ൐Ⴈ debug.getinfo(2).func ࠆ౼טႨ֥ݦඔđಖުђ৥ᆃ۱ݦඔ֥ upvaluesđቋުೂݔ໡ૌᅳ ֞۳ק଀ሳ֥эਈđ໡ૌᄝಆअэਈᇏҰᅳbᇿၩטႨ debug.getlocal ބ debug.getinfo ֥ҕඔ 2čႨট٠໙ᆞᄝטႨ֥ݦඔĎ֥Ⴈمb 2 23 3. .2 2 H Ho oo ok ks s debug ९֥ hook ൞ᆃဢ၂ᇕࠏᇅğᇿҨ၂۱ݦඔđႨটᄝӱ྽ᄎྛᇏଖ၂൙ࡱ֞ղ ൈФטႨb ႵඹᇕॖၛԨؿ၂۱ hook ֥൙ࡱğ ֒ Lua טႨ၂۱ݦඔ֥ൈީ call ൙ࡱؿളĠ ૄՑݦඔْ֥߭ൈީđreturn ൙ࡱؿളĠLua ष൓ᆳྛս઒֥ྍྛൈީđline ൙ࡱؿളĠ ᄎྛᆷקඔଢ֥ᆷ਷ᆭުđcount ൙ࡱؿളbLua ൐Ⴈֆ۱ҕඔטႨ hooksđҕඔູ၂۱ ૭ඍӁളטႨ֥൙ࡱğ"call"a"return"a"line" ࠇ "count"bਸ਼ຓđؓႿ line ൙ࡱđߎॖ ၛԮ־ֻؽ۱ҕඔğྍྛݼb໡ૌᄝ၂۱ hook ଽሹ൞ॖၛ൐Ⴈ debug.getinfo ࠆ౼۷؟ ֥ྐ༏b ൐ႨջႵਆ۱ࠇᆀ೘۱ҕඔ֥ debug.sethook ݦඔটᇿҨ၂۱ hookğֻ၂۱ҕඔ൞ hook ݦඔĠֻؽ۱ҕඔ൞၂۱૭ඍ໡ૌյෘࡓ॥֥൙ࡱ֥ሳژԱĠॖ࿊ֻ֥೘۱ҕඔ൞ ၂۱ඔሳđ૭ඍ໡ૌյෘࠆ౼ count ൙ࡱ֥௔ੱbູਔࡓ॥ callareturn ބ line ൙ࡱđॖ ၛࡼ෰ૌֻ֥၂۱ሳଛč'c'a'r' ࠇ 'l'ĎቆކӮ၂۱ mask ሳژԱࠧॖbေམܱו hooksđ ᆺླေ҂ջҕඔֹטႨ sethook ࠧॖb ༯૫֥ࡥֆս઒đ ൞၂۱νልჰ൓֥۵ሶఖğ յႆࢳ൤ఖᆳྛ֥ૄ၂۱ྍྛ֥ྛݼğ debug.sethook(print, "l") ഈ૫ᆃ၂ྛս઒đࡥֆ֥ࡼ print ݦඔቔູ hook ݦඔđѩᆷൕ Lua ֒ line ൙ࡱؿള ൈטႨ print ݦඔbॖၛ൐Ⴈ getinfo ࡼ֒భᆞᄝᆳྛ֥໓ࡱ଀ྐ༏ࡆഈಀđ൐֤۵ሶఖ ഍ັࣚᇁ֥ׄğ function trace (event, line) local s = debug.getinfo(2).short_src print(s .. ":" .. line) end
  175. Programming in Lua 174 Copyright ® 2005, Translation Team, www.luachina.net

    debug.sethook(trace, "l") 2 23 3. .3 3 P Pr ro of fi il le es s ࣐ܵ debug ९଀ሳഈुট൞၂۱טൔ९đԢਔႨႿטൔၛຓđߎॖၛႨႿປӮః෰ ಩ༀbᆃᇕӈ࡮֥಩ༀࣼ൞ profilingbؓႿ၂۱ൌൈ֥ profile টඪčFor a profile with timingĎ đቋݺ൐Ⴈ C ࢤ१টປӮğؓႿૄ၂۱ hook ݖ؟֥ Lua טႨսࡎ෾նѩ౏๙ӈ ߶֝ᇁҩਈ֥ࢲݔ҂ሙಒbಖطđؓႿ࠹ඔ֥ profiles ط࿽đLua ս઒ॖၛޓݺ഻֥಩b ༯૫ᆃ҆ٳ໡ૌࡼൌགྷ၂۱ࡥֆ֥ profilerğਙԛᄝӱ྽ᄎྛݖӱᇏđૄ၂۱ݦඔФטႨ ֥Ցඔb ໡ૌӱ྽֥ᇶေඔऌࢲܒ൞ਆᅦіđ၂ᅦܱ৳ݦඔބ෰ૌטႨՑඔ֥іđ၂ᅦܱ৳ ݦඔބݦඔ଀֥іbᆃਆ۱і֥෬ႄ༯ѓ൞ݦඔЧദb local Counters = {} local Names = {} ᄝ profiling ᆭުđ໡ૌॖၛ٠໙ݦඔ଀ඔऌđ֌൞࠺ᇾğᄝݦඔᄝࠃ׮ሑ෿֥౦ঃ ༯đॖၛ֤֞бࢠݺ֥ࢲݔđၹູପൈީ Lua ߶ҳुᆞᄝᄎྛ֥ݦඔ֥ս઒টҰᅳᆷק ֥ݦඔ଀b གྷᄝ໡ૌקၬ hook ݦඔđ ෰֥಩ༀࣼ൞ࠆ౼ᆞᄝᆳྛ֥ݦඔѩࡼؓႋ֥࠹ඔఖࡆ 1Ġ ๝ൈᆃ۱ hook ݦඔ္൬ࠢݦඔ଀ྐ༏ğ local function hook () local f = debug.getinfo(2, "f").func if Counters[f] == nil then -- first time `f' is called? Counters[f] = 1 Names[f] = debug.getinfo(2, "Sn") else -- only increment the counter Counters[f] = Counters[f] + 1 end end ༯၂҄ࣼ൞൐Ⴈᆃ۱ hook ᄎྛӱ྽đ ໡ૌࡌഡӱ྽֥ᇶ chunk ᄝ၂۱໓ࡱଽđ ѩ౏ Ⴈ޼ࡼᆃ۱໓ࡱ଀ቔູ profiler ֥ҕඔğ prompt> lua profiler main-prog ᆃᇕ౦ঃ༯đ໡ૌ֥໓ࡱ଀Ќթᄝ arg[1]đյष hook ѩᄎྛ໓ࡱğ local f = assert(loadfile(arg[1])) debug.sethook(hook, "c") -- turn on the hook
  176. Programming in Lua 175 Copyright ® 2005, Translation Team, www.luachina.net

    f() -- run the main program debug.sethook() -- turn off the hook ቋު၂҄൞ཁൕࢲݔđ༯၂۱ݦඔູ၂۱ݦඔӁള଀ӫđၹູᄝ Lua ᇏ֥ݦඔ଀҂ ಒקđ෮ၛ໡ૌؓૄ၂۱ݦඔࡆഈ෰໊֥ᇂྐ༏đ྘ೂ file:line bೂݔ၂۱ݦඔીႵ଀ ሳđ ପહ໡ૌᆺႨ෱໊֥ᇂіൕb ೂݔ၂۱ݦඔ൞ C ݦඔđ ໡ૌᆺ൞Ⴈ෱֥଀ሳіൕ č෰ ીႵ໊ᇂྐ༏Ď b function getname (func) local n = Names[func] if n.what == "C" then return n.name end local loc = string.format("[%s]:%s", n.short_src, n.linedefined) if n.namewhat ~= "" then return string.format("%s (%s)", loc, n.name) else return string.format("%s", loc) end end ቋުđ໡ૌյႆૄ၂۱ݦඔބ෰֥࠹ඔఖğ for func, count in pairs(Counters) do print(getname(func), count) end ೂݔ໡ૌࡼ໡ૌ֥ profiler ႋႨ֞ Section 10.2 ֥ઔغ॓ڏ৽֥২ሰഈđ໡ૌ֤֞ೂ ༯ࢲݔğ [markov.lua]:4 884723 write 10000 [markov.lua]:0 (f) 1 read 31103 sub 884722 [markov.lua]:1 (allwords) 1 [markov.lua]:20 (prefix) 894723 find 915824 [markov.lua]:26 (insert) 884723 random 10000 sethook 1 insert 884723
  177. Programming in Lua 176 Copyright ® 2005, Translation Team, www.luachina.net

    ପၩ໅ሢֻඹྛ֥େ଀ݦඔčᄝ allwords ଽקၬ֥םսݦඔĎФטႨ 884,723 Ցđ write(io.write)ФטႨ 10,000 Ցb ୆ॖၛؓᆃ۱ profiler ࣉྛ၂ུڿࣉđбೂؓൻԛஆ྽aյႆԛбࢠݺ֥ݦඔ଀aڿ ೿ൻԛ۬ൔb ҂ݖđ ᆃ۱ࠎЧ֥ profiler ၘࣜޓႵႨđ ѩ౏ॖၛቔູޓ؟ۚࠩ۽ऎ֥ࠎԤb
  178. Programming in Lua 178 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 24 ᅣ C API ሺফ Lua ൞၂۱ళೆൔ֥ე࿽đၩ໅ሢ Lua ҂ࣇॖၛ൞၂۱׿৫ᄎྛ֥ӱ྽Ї္ॖၛ൞ ၂۱Ⴈটళೆః෰ႋႨ֥ӱ྽९b୆ॖିत֤అܯğೂݔ Lua ҂ᆺ൞׿৫֥ӱ྽đູ൉ હ֞ଢభູᆸܺԬᆜЧ඀໡ૌ׻൞ᄝ൐Ⴈ Lua ׿৫ӱ྽଻Ĥᆃ۱໙ี֥ճσᄝႿ Lua ࢳ ൤ఖčॖᆳྛ֥ luaĎ bLua ࢳ൤ఖ൞၂۱൐Ⴈ Lua ѓሙ९ൌགྷ֥׿৫֥ࢳ൤ఖđෲ൞၂ ۱ޓཬ֥ႋႨčሹ܋҂ӑݖ 500 ྛ֥ս઒Ď bࢳ൤ఖڵᄳӱ྽ބ൐Ⴈᆀ֥ࢤ१ğՖ൐Ⴈᆀ ପ৚ࠆ౼໓ࡱࠇᆀሳژԱđѩԮ۳ Lua ѓሙ९đLua ѓሙ९ڵᄳቋᇔ֥ս઒ᄎྛb Lua ॖၛቔູӱ྽९ႨটঔᅚႋႨ֥ۿିđ္ࣼ൞ Lua ॖၛቔູঔᅚྟე࿽֥ჰၹ ෮ᄝb๝ൈđLua ӱ྽ᇏॖၛᇿҨႵః෰ე࿽ൌགྷ֥ݦඔđᆃུݦඔॖିႮ C ე࿽(ࠇః ෰ე࿽)ൌགྷđॖၛᄹࡆ၂ུ҂ಸၞႮ Lua ൌགྷ֥ۿିbᆃ൐֤ Lua ൞ॖঔᅚ֥bაഈ૫ ਆᇕܴׄ(Lua ቔູঔᅚྟე࿽ބॖঔᅚ֥ე࿽)ؓႋ֥ C ބ Lua ᇏࡗႵਆᇕࢌ޺ٚൔb ֻ၂ᇕđC ቔູႋႨӱ྽ე࿽đLua ቔູ၂۱९൐ႨĠֻؽᇕđّݖটđLua ቔູӱ྽ ე࿽đC ቔູ९൐ႨbᆃਆᇕٚൔđC ე࿽׻൐Ⴈཌྷ๝֥ API ა Lua ๙ྐđၹՎ C ބ Lua ࢌ޺ᆃ҆ٳӫູ C APIb C API ൞၂۱ C ս઒ა Lua ࣉྛࢌ޺֥ݦඔࠢb෰Ⴕၛ༯҆ٳቆӮğ؀ཿ Lua ಆअ эਈ֥ݦඔđטႨ Lua ݦඔ֥ݦඔđᄎྛ Lua ս઒ோ؎֥ݦඔđᇿҨ C ݦඔಖުॖၛᄝ Lua ᇏФטႨ֥ݦඔđ֩֩b čЧ඀ᇏđඌეݦඔൌ࠽ഈᆷݦඔࠇᆀޡđAPI Ⴕུݦඔູ ਔٚьၛޡ֥ٚൔൌགྷĎ C API ቎࿖ C ე࿽֥ეمྙൔđᆃ Lua Ⴕ෮҂๝b֒൐Ⴈ C ࣉྛӱ྽ഡ࠹֥ൈީđ ໡ૌсྶᇿၩđো྘࡟Ұđհ༂ԩ৘đଽթٳ஥׻ޓ؟໙ีbAPI ᇏ֥ն҆ٳݦඔѩ҂ ࡟Ұ෰ૌҕඔ֥ᆞಒྟĠ୆ླေᄝטႨݦඔᆭభڵᄳಒЌҕඔ൞Ⴕི֥bೂݔ୆Ԯ־ਔ հ༂֥ҕඔđॖି֤֞ \"segmentation fault\" ᆃဢࠇᆀোර֥հ༂ྐ༏đطીႵޓૼಒ ֥հ༂ྐ༏ॖၛࠆ֤bਸ਼ຓđAPI ᇗׄ٢ᄝਔਲࠃྟބࡥࢱྟٚ૫đႵൈީၛ།വٚь ൌႨູսࡎ֥b၂Ϯ֥಩ༀॖିླေടࠣޓ؟۱ API טႨđᆃॖି਷ದِସđ֌൞෰۳ ୆ิ܂ਔؓ༥ࢫ֥ಆ҆॥ᇅ֥ି৯đбೂհ༂ԩ৘đߏԊնཬđބোර֥໙ีbೂЧᅣ ֥ѓี෮ൕđᆃ၂ᅣ֥ଢѓ൞ؓ֒୆Ֆ C טႨ Lua ൈࡼടࠣ֞ଧུଽಸ֥ყফbೂݔ҂ ି৘ࢳଖུ༥ࢫ҂ေሢࠤđު૫໡ૌ߶၂၂བྷ༥ࢺകb҂ݖđᄝ Lua ҕॉ൭ҨᇏႵؓᆷ קݦඔ֥བྷ༥૭ඍbਸ਼ຓđᄝ Lua ؿ҃ϱᇏ୆ॖၛु֞ API ֥ႋႨ֥২ሰđLua ׿৫֥ ࢳ൤ఖčlua.cĎิ܂ਔႋႨս઒֥২ሰđطѓሙ९člmathlib.calstrlib.c ֩֩Ďิ܂ਔӱ ྽९ս઒֥২ሰb Ֆགྷᄝष൓đ୆պഈਔ C ӱ྽ჴ֥શሰđ֒໡ૌซ֞o୆/୆ૌp đ໡ૌၩන൞ᆷ֒ ୆൐Ⴈ C щӱ֥ൈީbᄝ C ބ Lua ᆭࡗ๙ྐܱ࡯ଽಸᄝႿ၂۱ྴ୅֥ᅜbࠫެ෮Ⴕ֥ API טႨ׻൞ؓᅜഈ֥ᆴࣉྛҠቔđ෮Ⴕ C ა Lua ᆭࡗ֥ඔऌࢌߐ္׻๙ݖᆃ۱ᅜটປ Ӯbਸ਼ຓđ୆္ॖၛ൐ႨᅜটЌթਢൈэਈbᅜ֥൐Ⴈࢳथਔ C ބ Lua ᆭࡗਆ۱҂ླྀט
  179. Programming in Lua 179 Copyright ® 2005, Translation Team, www.luachina.net

    ֥໙ีğֻ၂đLua ߶ሱ׮ࣉྛগࠍ൬ࠢđط C ေ౰ཁൕ֥ٳ஥թԥֆჭđਆᆀႄఏ֥ ઱؛bֻؽđLua ᇏ֥׮෿ো྘ބ C ᇏ֥࣡෿ো྘҂၂ᇁႄఏ֥ࠁ੹b໡ૌࡼᄝ 24.2 ࢫ བྷ༥ֹࢺകᅜ֥ཌྷܱଽಸb 2 24 4. .1 1 ֻ ֻ၂ ၂۱ ۱ൕ ൕ২ ২ӱ ӱ྽ ྽ ๙ݖ၂۱ࡥֆ֥ႋႨӱ྽ಞ໡ૌष൓ᆃ۱ყফğ၂۱׿৫֥ Lua ࢳ൤ఖ֥ൌགྷb໡ ૌཿ၂۱ࡥֆ֥ࢳ൤ఖđս઒ೂ༯ğ #include <stdio.h> #include <lua.h> #include <lauxlib.h> #include <lualib.h> int main (void) { char buff[256]; int error; lua_State *L = lua_open(); /* opens Lua */ luaopen_base(L); /* opens the basic library */ luaopen_table(L); /* opens the table library */ luaopen_io(L); /* opens the I/O library */ luaopen_string(L); /* opens the string lib. */ luaopen_math(L); /* opens the math lib. */ while (fgets(buff, sizeof(buff), stdin) != NULL) { error = luaL_loadbuffer(L, buff, strlen(buff), "line") || lua_pcall(L, 0, 0, 0); if (error) { fprintf(stderr, "%s", lua_tostring(L, -1)); lua_pop(L, 1);/* pop error message from the stack */ } } lua_close(L); return 0; } ๨໓ࡱ lua.h קၬਔ Lua ิ܂֥ࠎԤݦඔbఃᇏЇওԷࡹ၂۱ྍ֥ Lua ߌ࣢֥ݦඔ čೂ lua_openĎ đטႨ Lua ݦඔčೂ lua_pcallĎ֥ݦඔđ؀౼/ཿೆ Lua ߌ࣢֥ಆअэਈ
  180. Programming in Lua 180 Copyright ® 2005, Translation Team, www.luachina.net

    ֥ݦඔđᇿҨॖၛФ Lua ս઒טႨ֥ྍݦඔ֥ݦඔđ֩֩b෮Ⴕᄝ lua.h ᇏФקၬ֥׻ Ⴕ၂۱ lua_భሗb ๨໓ࡱ lauxlib.h קၬਔڣᇹ९čauxlibĎิ܂֥ݦඔb๝ဢđ෮Ⴕᄝఃᇏקၬ֥ݦ ඔ֩׻ၛ luaL_յ๨č২ೂđluaL_loadbufferĎ bڣᇹ९০Ⴈ lua.h ᇏิ܂֥ࠎԤݦඔิ܂ ਔ۷ۚҪՑഈ֥ԎའĠ෮Ⴕ Lua ѓሙ९׻൐Ⴈਔ auxlibbࠎԤ API ᇁ৯Ⴟ economy and orthogonalityđཌྷّ auxlib ᇁ৯Ⴟൌགྷ၂Ϯ಩ༀ֥ൌႨྟb֒ಖđࠎႿ୆֥ӱ྽֥ླေط Էࡹః෱֥Ԏའ္൞٤ӈಸၞ֥bླေ૿࠺ᄝྏ֥൞đauxlib ીႵթ౼ Lua ଽ֥҆ಃཋb ෱ປӮ෱෮Ⴕ֥۽ቔ׻൞๙ݖᆞൔ֥ࠎЧ APIb Lua ९ીႵקၬ಩ޅಆअэਈb෱෮Ⴕ֥ሑ෿Ќթᄝ׮෿ࢲܒ lua_State ᇏđط౏ᆷ ཟᆃ۱ࢲܒ֥ᆷᆌቔູ෮Ⴕ Lua ݦඔ֥၂۱ҕඔbᆃဢ֥ൌགྷٚൔ൐֤ Lua ିܔᇗೆ čreentrantĎ౏ູᄝ؟ཌӱᇏ֥൐ႨቔݺሙСb ݦඔ lua_open Էࡹ၂۱ྍߌ࣢čࠇ stateĎ blua_open Էࡹ၂۱ྍ֥ߌ࣢ൈđᆃ۱ߌ ࣢ѩ҂Їওყקၬ֥ݦඔđമᇀ൞ printbູਔЌӻ Lua ֥૬่đ෮Ⴕ֥ѓሙ९ၛֆ׿֥ Їิ܂đ෮ၛೂݔ୆҂ླေࣼ҂߶఼౰୆൐Ⴈ෱ૌb๨໓ࡱ lualib.h קၬਔյषᆃུ९ ֥ݦඔb২ೂđטႨ luaopen_iođၛԷࡹ io table ѩᇿҨ I/O ݦඔčio.read,io.write ֩֩Ď ֞ Lua ߌ࣢ᇏb Էࡹ၂۱ state ѩࡼѓሙ९ᄛೆᆭުđࣼॖၛሢ൭ࢳ൤Ⴈ޼֥ൻೆਔbؓႿႨ޼ൻೆ ֥ૄ၂ྛđC ӱ྽൮༵טႨ luaL_loadbuffer щၲᆃུ Lua ս઒bೂݔીႵհ༂đᆃ۱ט Ⴈْ߭ਬѩϜщၲᆭު֥ chunk ࿢ೆᅜb č࠺ᇾđ໡ૌࡼᄝ༯၂ࢫᇏษંଊمϮ֥ᅜĎᆭ ުđC ӱ྽טႨ lua_pcallđ෱ࡼ߶Ϝ chunk Ֆᅜᇏ֐ԛѩᄝЌ޹ଆൔ༯ᄎྛ෱bބ luaL_laodbuffer ၂ဢđlua_pcall ᄝીႵհ༂֥౦ঃ༯ْ߭ਬbᄝႵհ༂֥౦ঃ༯đᆃਆ ۱ݦඔ׻ࡼ၂่հ༂ཨ༏࿢ೆᅜĠ໡ૌॖၛႨ lua_tostring ট֤֞ᆃ่ྐ༏aൻԛ෱đႨ lua_pop ࡼ෱Ֆᅜᇏ೷Ԣb ᇿၩđᄝႵհ༂ؿള֥౦ঃ༯đᆃ۱ӱ྽ࡥֆ֥ൻԛհ༂ྐ༏֞ѓሙհ༂ੀbᄝ C ᇏđൌ࠽֥հ༂ԩ৘ॖି൞٤ӈگᄖ֥ط౏ೂޅԩ৘၇ঠႿႋႨӱ྽ЧദbLua ނྏथ ҂߶ᆰࢤൻԛ಩ޅת༆֞಩ༀൻԛੀഈĠ෱๙ݖْ߭հ༂ս઒ބհ༂ྐ༏টؿԛհ༂ྐ ݼb ૄ၂۱ႋႨӱ྽׻ॖၛႨቋൡކ෱ૌሱ֥࠭ٚൔটԩ৘ᆃུհ༂b ູਔษં֥ࡥֆđ གྷᄝ໡ૌࡌམ၂۱ࡥֆ֥հ༂ԩ৘ٚൔđ ࣼའ༯૫ս઒၂ဢđ ෱ᆺ൞ൻԛ၂่հ༂ྐ༏a ܱо Lua statea๼ԛᆜ۱ႋႨӱ྽b #include <stdarg.h> #include <stdio.h> #include <stdlib.h> void error (lua_State *L, const char *fmt, ...) { va_list argp; va_start(argp, fmt); vfprintf(stderr, argp); va_end(argp);
  181. Programming in Lua 181 Copyright ® 2005, Translation Team, www.luachina.net

    lua_close(L); exit(EXIT_FAILURE); } ഍ީ໡ૌᄜབྷ༥֥ษંܱႿᄝႋႨս઒ᇏೂޅԩ৘հ༂.ၹູ୆ॖၛࡼ Lua ބ C/C++ ս઒၂ఏщၲđlua.h ѩ҂Їݣᆃུׅ྘֥ᄝః෰ C ९ᇏԛགྷ֥ᆜކս઒ğ #ifdef __cplusplus extern "C" { #endif ... #ifdef __cplusplus } #endif ၹՎđ ೂݔ୆Ⴈ C ٚൔটщၲ෱đ ֌Ⴈᄝ C++ᇏđ ପહ୆ླေའ༯૫ᆃဢটЇݣ lua.h ๨໓ࡱb extern "C" { #include <lua.h> } ၂۱ӈႨ֥࠯ె൞ࡹ৫၂۱Їݣഈ૫ս઒֥ lua.hpp ๨໓ࡱđ ѩࡼᆃ۱ྍ֥๨໓ࡱЇ ݣࣉ୆֥ C++ӱ྽b 2 24 4. .2 2 ؐ ؐᅜ ᅜ ֒ᄝ Lua ބ C ᆭࡗࢌߐඔऌൈ໡ૌ૫ਢሢਆ۱໙ีğ ׮෿ა࣡෿ো྘༢๤֥҂௄஥ ބሱ׮ა൭׮ଽթܵ৘֥҂၂ᇁb ᄝ Lua ᇏđ໡ૌཿ༯ a[k]=v ൈđk ބ v ॖၛႵࠫᇕ҂๝֥ো྘čႮႿ metatables ֥ թᄝđa ္ॖିႵ҂๝֥ো྘Ď bೂݔ໡ૌམᄝ C ᇏิ܂োර֥Ҡቔđ໭ંᄸဢđҠቔі ֥ݦඔ(settable)сקႵ၂۱ܥק֥ো྘b໡ૌࡼླေࠫ൅۱҂๝֥ݦඔটປӮᆃ၂۱֥ Ҡቔč೘۱ҕඔ֥ো྘֥ૄ၂ᇕቆކ׻ླေ၂۱ݦඔĎ b ໡ૌॖၛᄝ C ᇏലૼ၂ུ union ো྘টࢳथᆃ۱໙ีđ໡ૌӫᆭູ lua_Valueđ෱ି ܔ૭ඍ෮Ⴕো྘֥ Lua ᆴbಖުđ໡ૌࣼॖၛᆃဢലૼ settable void lua_settable (lua_Value a, lua_Value k, lua_Value v); ᆃ۱ࢳथٚσႵਆ۱ಌׄb ֻ၂đ ေࡼೂՎگᄖ֥ো྘႘ഝ֞ః෱ე࿽ॖିޓ঒଴Ġ Lua ҂ࣇФഡ࠹ູა C/C++ၞႿࢌ޺đJava,Fortran ၛࠣোර֥ე࿽္၂ဢbֻؽđLua ڵᄳগࠍ߭൬ğೂݔ໡ૌࡼ Lua ᆴЌթᄝ C эਈᇏđLua ႄౣીႵϷمਔࢳᆃᇕႨمĠ ෱ॖିհ༂ֹಪູଖ۱ᆴູগࠍѩ൬ࠢ෰b
  182. Programming in Lua 182 Copyright ® 2005, Translation Team, www.luachina.net

    ၹՎđLua API ીႵקၬ಩ޅোර lua_Value ֥ো྘bูս֥ٚσđ෱Ⴈ၂۱Ԏའ֥ ᅜᄝ Lua ა C ᆭࡗࢌߐᆴbᅜᇏ֥ૄ၂่࠺੣׻ॖၛЌթ಩ޅ Lua ᆴb໭ં୆ޅൈམေ Ֆ Lua ౨౰၂۱ᆴčбೂ၂۱ಆअэਈ֥ᆴĎ đטႨ LuađФ౨౰֥ᆴࡼ߶Ф࿢ೆᅜb໭ ં୆ޅൈམေԮ־၂۱ᆴ۳ Luađ൮༵ࡼᆃ۱ᆴ࿢ೆᅜđಖުטႨ Luačᆃ۱ᆴࡼФ֐ ԛĎ b ໡ૌಯಖླေ၂۱҂๝֥ݦඔࡼૄᇕ C ো྘࿢ೆᅜބ၂۱҂๝ݦඔՖᅜഈ౼ᆴ čၲ ᇿğᆺ൞౼ԛ҂൞֐ԛĎ đ֌൞໡ૌх૧ਔቆކൔ֥Еᅉčcombinatorial explosionĎ bਸ਼ ຓđၹູᅜ൞Ⴎ Lua টܵ৘֥đগࠍ߭൬ఖᆩ֡ପ۱ᆴᆞᄝФ C ൐Ⴈb ࠫެ෮Ⴕ֥ API ݦඔ׻Ⴈ֞ਔᅜbᆞೂ໡ૌᄝֻ၂۱২ሰᇏ෮ु֥֞đluaL_loadbuffer Ϝ෱֥ࢲݔ਽ᄝ ਔᅜഈčФщၲ֥ chunk ࠇ၂่հ༂ྐ༏Ď Ġlua_pcall Ֆᅜഈࠆ౼ေФטႨ֥ݦඔѩϜ಩ ޅਢൈ֥հ༂ྐ༏٢ᄝᆃ৚b Lua ၛ၂۱࿸֥۬ LIFO ܿᄵčުࣉ༵ԛĠ္ࣼ൞ඪđ൓ᇔթ౼ᅜפĎটҠቔᅜb ֒୆טႨ Lua ൈđ෱ᆺ߶ڿэᅜפ҆ٳb୆֥Ĩս઒ಏႵ۷؟֥ሱႮĠ۷ૼಒ֥টࢃđ ୆ॖၛҰ࿘ᅜഈ֥಩ޅჭ෍đമᇀ൞ᄝ಩ޅ၂۱໊ᇂҬೆބ೷Ԣჭ෍b 2 24 4. .2 2. .1 1 ࿢ ࿢ೆ ೆჭ ჭ෍ ෍ API Ⴕ၂༢ਙ࿢ᅜ֥ݦඔđ෱ࡼૄᇕॖၛႨ C ট૭ඍ֥ Lua ো྘࿢ᅜğॢᆴčnilĎ Ⴈ lua_pushnilđඔᆴ྘čdoubleĎႨ lua_pushnumberđ҃غ྘čᄝ C ᇏႨᆜඔіൕĎႨ lua_pushbooleanđ಩ၩ֥ሳژԱčchar*ো྘đᄍྸЇݣ'\0'ሳژĎႨ lua_pushlstringđC ე࿽ڄ۬čၛ'\0'ࢲඏĎ֥ሳژԱčconst char*ĎႨ lua_pushstringğ void lua_pushnil (lua_State *L); void lua_pushboolean (lua_State *L, int bool); void lua_pushnumber (lua_State *L, double n); void lua_pushlstring (lua_State *L, const char *s, size_t length); void lua_pushstring (lua_State *L, const char *s); ๝ဢ္Ⴕࡼ C ݦඔބ userdata ᆴ࿢ೆᅜ֥ݦඔđ഍ު߶ษં֞෱ૌb Lua ᇏ֥ሳژԱ҂൞ၛਬູࢲඏژ֥Ġ෱ૌ၇ঠႿ၂۱ૼಒ֥Ӊ؇đၹՎॖၛЇݣ ಩ၩ֥ؽࣉᇅඔऌb ࡼሳژԱ࿢ೆԱ֥ᆞൔݦඔ൞ lua_pushlstringđ ෱ေ౰၂۱ૼಒ֥Ӊ ؇ቔູҕඔbؓႿၛਬࢲඏ֥ሳژԱđ୆ॖၛႨ lua_pushstringč෱Ⴈ strlen ট࠹ෘሳژ ԱӉ؇Ď bLua Ֆট҂Ќӻ၂۱ᆷཟຓ҆ሳژԱčࠇ಩ޅః෱ؓའđԢਔ C ݦඔii෱ሹ ൞࣡෿ᆷᆌĎ֥ᆷᆌbؓႿ෱Ќӻ֥෮ႵሳژԱđLua ေહቓ၂ٺଽ֥҆ॊНေહᇗྍ ০Ⴈၘࣜթᄝ֥ሳژԱbၹՎđ၂֊ᆃུݦඔْ߭ᆭު୆ॖၛሱႮ֥ྩڿࠇ൞൤٢୆֥ ߏԊ౵b ໭ં୆ޅൈ࿢ೆ၂۱ჭ෍֞ᅜഈđ ୆Ⴕᄳ಩ಒЌᄝᅜഈႵॢࡗটቓᆃࡱ൙౦b ࠺ᇾđ ୆གྷᄝ൞ C ӱ྽ჴĠLua ҂߶ԍሢ୆b֒ Lua ᄝఏ൓ၛࠣᄝ Lua טႨ C ֥ൈީđᅜഈᇀ ഒႵ 20 ۱ॢ༽֥࠺੣ člua.h ᇏ֥ LUA_MINSTACK ޡקၬਔᆃ۱ӈਈĎ b ؓႿ؟ඔ௴๙ ֥Ⴈمᅜ൞ቀܔ֥đ෮ၛ๙ӈ໡ૌ҂сಀॉ੮෱b໭ંೂޅđႵུ಩ༀࠇྸླေ۷؟֥
  183. Programming in Lua 183 Copyright ® 2005, Translation Team, www.luachina.net

    ᅜॢࡗčೂđטႨ၂۱҂קҕඔඔଢ֥ݦඔĎ bᄝᆃᇕ౦ঃ༯đࠇྸ୆ླေטႨ༯૫ᆃ۱ ݦඔğ int lua_checkstack (lua_State *L, int sz); ෱࡟ҩᅜഈ൞ڎႵቀܔ୆ླေ֥ॢࡗč഍ު߶ႵܱႿ෱۷؟֥ྐ༏Ď b 2 24 4. .2 2. .2 2 Ұ Ұ࿘ ࿘ჭ ჭ෍ ෍ API Ⴈ෬ႄট٠໙ᅜᇏ֥ჭ෍bᄝᅜᇏֻ֥၂۱ჭ෍č္ࣼ൞ֻ၂۱Ф࿢ೆᅜ֥Ď Ⴕ෬ႄ 1đ༯၂۱Ⴕ෬ႄ 2đၛՎো๷b໡ૌ္ॖၛႨᅜפቔູҕᅶটթ౼ჭ෍đ০Ⴈڵ ෬ႄbᄝᆃᇕ౦ঃ༯đ-1 ᆷԛᅜפჭ෍č္ࣼ൞ቋުФ࿢ೆ֥Ď đ-2 ᆷԛ෱֥భ၂۱ჭ ෍đၛՎো๷b২ೂđטႨ lua_tostring(L, -1)ၛሳژԱ֥ྙൔْ߭ᅜפ֥ᆴb໡ૌ༯૫ ࡼु֞đᄝଖུӆކ൐Ⴈᆞ෬ႄ٠໙ᅜбࢠٚьđਸ਼ຓ၂ུ౦ঃ༯đ൐Ⴈڵ෬ႄ٠໙ᅜ ۷ٚьb API ิ܂ਔ၂ส lua_is*ݦඔট࡟Ұ၂۱ჭ෍൞ڎ൞၂۱ᆷק֥ো྘đ*ॖၛ൞಩ޅ Lua ো྘bၹՎႵ lua_isnumber,lua_isstring,lua_istable ၛࠣোර֥ݦඔb෮Ⴕᆃུݦඔ׻ Ⴕ๝ဢ֥ჰ྘ğ int lua_is... (lua_State *L, int index); lua_isnumber ބ lua_isstring ݦඔ҂࡟Ұᆃ۱ᆴ൞ڎ൞ᆷק֥ো྘đط൞ु෱൞ڎି ФሇߐӮᆷק֥ପᇕো྘b২ೂđ಩ޅඔሳো྘׻ડቀ lua_isstringb ߎႵ၂۱ lua_type ݦඔđ෱ْ߭ᅜᇏჭ෍֥ো྘b člua_is*ᇏ֥Ⴕུݦඔൌ࠽ഈ൞Ⴈ ਔᆃ۱ݦඔקၬ֥ޡĎᄝ lua.h ๨໓ࡱᇏđૄᇕো྘׻Фקၬູ၂۱ӈਈğLUA_TNILa LUA_TBOOLEAN a LUA_TNUMBER a LUA_TSTRING a LUA_TTABLE a LUA_TFUNCTIONaLUA_TUSERDATA ၛࠣ LUA_TTHREADbᆃ۱ݦඔᇶေФႨᄝა ၂۱ switch ეओ৳ކ൐Ⴈb֒໡ૌླေᆇᆞ֥࡟ҰሳژԱބඔሳো྘ൈ෱္൞ႵႨ֥ ູਔՖᅜᇏࠆ֤ᆴđᆃ৚Ⴕ lua_to*ݦඔğ int lua_toboolean (lua_State *L, int index); double lua_tonumber (lua_State *L, int index); const char * lua_tostring (lua_State *L, int index); size_t lua_strlen (lua_State *L, int index); ࠧ൐۳ק֥ჭ෍֥ো྘҂ᆞಒđ טႨഈ૫ᆃུݦඔ္ીႵ൉હ໙ีb ᄝᆃᇕ౦ঃ༯đ lua_tobooleanalua_tonumber ބ lua_strlen ْ߭ 0đః෰ݦඔْ߭ NULLbႮႿ ANSI C ી Ⴕิ܂Ⴕི֥ॖၛႨট஑؎հ༂ؿളඔሳᆴđ෮ၛْ֥߭ 0 ൞ીႵ൉હႨԩ֥bؓႿః ෰ݦඔط࿽đ໡ૌ၂Ϯ҂ླေ൐Ⴈؓႋ֥ lua_is*ݦඔğ໡ૌᆺླေטႨ lua_is*đҩ൫ْ ߭ࢲݔ൞ڎູ NULL ࠧॖb Lua_tostring ݦඔْ߭၂۱ᆷཟሳژԱ֥ଽ҆ॊН֥ᆷᆌb୆҂ିྩڿ෱č൐୆མఏ ପ৚Ⴕ၂۱ constĎ bᆺေᆃ۱ᆷᆌؓႋ֥ᆴߎᄝᅜଽđLua ߶Ќᆣᆃ۱ᆷᆌ၂ᆰႵིb
  184. Programming in Lua 184 Copyright ® 2005, Translation Team, www.luachina.net

    ֒၂۱ C ݦඔْ߭ުđLua ߶ౢ৘෰֥ᅜđ෮ၛđႵ၂۱ჰᄵğႥჹ҂ေࡼᆷཟ Lua ሳ ژԱ֥ᆷᆌЌթ֞٠໙෰ૌ֥ຓ҆ݦඔᇏb Lua_string ْ֥߭ሳژԱࢲແሹ߶Ⴕ၂۱ሳژࢲඏѓᆽ 0đ ֌൞ሳژԱᇏࡗ္ॖିЇ ݣ 0đlua_strlen ْ߭ሳژԱ֥ൌ࠽Ӊ؇bห൹౦ঃ༯đࡌקᅜפ֥ᆴ൞၂۱ሳژԱđ༯ ૫֥؎࿽(assert)ሹ൞Ⴕི֥ğ const char *s = lua_tostring(L, -1); /* any Lua string */ size_t l = lua_strlen(L, -1); /* its length */ assert(s[l] == '\0'); assert(strlen(s) <= l); 2 24 4. .2 2. .3 3 ః ః෰ ෰ؐ ؐᅜ ᅜҠ Ҡቔ ቔ Ԣषഈ૫෮ิ֥ࠣ C აؐᅜࢌߐᆴ֥ݦඔຓđAPI ္ิ܂ਔ༯ਙݦඔটປӮ๙ӈ֥ ؐᅜົ޹۽ቔğ int lua_gettop (lua_State *L); void lua_settop (lua_State *L, int index); void lua_pushvalue (lua_State *L, int index); void lua_remove (lua_State *L, int index); void lua_insert (lua_State *L, int index); void lua_replace (lua_State *L, int index); ݦඔ lua_gettop ْ߭ؐᅜᇏ֥ჭ෍۱ඔđ෱္൞ᅜפჭ෍֥෬ႄbᇿၩ၂۱ڵඔ෬ ႄ-x ؓႋႿᆞඔ෬ႄ gettop-x+1blua_settop ഡᇂᅜפč္ࣼ൞ؐᅜᇏ֥ჭ෍۱ඔĎູ၂ ۱ᆷק֥ᆴbೂݔष൓֥ᅜפۚႿྍ֥ᅜפđפ֥҆ᆴФשఙbڎᄵđູਔ֤֞ᆷק֥ նཬᆃ۱ݦඔ࿢ೆཌྷႋ۱ඔ֥ॢᆴčnilĎ֞ᅜഈbหљ֥đlua_settop(L,0)ౢॢؐᅜb୆ ္ॖၛႨڵඔ෬ႄቔູטႨ lua_settop ֥ҕඔĠପࡼ߶ഡᇂᅜפ֞ᆷק֥෬ႄb০Ⴈᆃ ᇕ࠯ెđAPI ิ܂ਔ༯૫ᆃ۱ޡđ෱Ֆؐᅜᇏ֐ԛ n ۱ჭ෍ğ #define lua_pop(L,n) lua_settop(L, -(n)-1) ݦඔ lua_pushvalue ࿢ೆؐᅜഈᆷק෬ႄ֥၂۱ᒼН֞ᅜפĠ lua_remove ၍Ԣᆷק෬ ႄ໊ᇂ֥ჭ෍đѩࡼఃഈ૫෮Ⴕ֥ჭ෍༯၍টแҀᆃ۱໊ᇂ֥ॢϢĠlua_insert ၍׮ᅜפ ჭ෍֞ᆷק෬ႄ໊֥ᇂđѩࡼᆃ۱෬ႄ໊ᇂഈ૫֥ჭ෍ಆ҆ഈ၍ᇀᅜפФ၍׮਽༯֥ॢ ۯĠቋުđlua_replace Ֆᅜפ֐ԛჭ෍ᆴѩࡼఃഡᇂ֞ᆷק෬ႄ໊ᇂđીႵ಩ޅ၍׮Ҡ ቔbᇿၩ֞༯૫֥ҠቔؓؐᅜીႵ಩ޅ႕ཙğ lua_settop(L, -1); /* set top to its current value */ lua_insert(L, -1); /* move top element to the top */ ູਔඪૼᆃུݦඔ֥Ⴈمđᆃ৚Ⴕ၂۱ႵႨ֥Ϻᇹݦඔđ෱ dump ᆜ۱ؐᅜ֥ଽಸğ static void stackDump (lua_State *L) {
  185. Programming in Lua 185 Copyright ® 2005, Translation Team, www.luachina.net

    int i; int top = lua_gettop(L); for (i = 1; i <= top; i++) { /* repeat for each level */ int t = lua_type(L, i); switch (t) { case LUA_TSTRING: /* strings */ printf("`%s'", lua_tostring(L, i)); break; case LUA_TBOOLEAN: /* booleans */ printf(lua_toboolean(L, i) ? "true" : "false"); break; case LUA_TNUMBER: /* numbers */ printf("%g", lua_tonumber(L, i)); break; default: /* other values */ printf("%s", lua_typename(L, t)); break; } printf(" "); /* put a separator */ } printf("\n"); /* end the listing */ } ᆃ۱ݦඔՖᅜָ֞ᅜפђ৥ਔᆜ۱ؐᅜđ၇ᅶૄ۱ჭ෍ሱ֥࠭ো྘յႆԛఃᆴb෱ ႨႄݼൻԛሳژԱĠၛ%g ֥۬ൔൻԛඔሳĠؓႿః෱ᆴčtableđݦඔđ֩֩Ď෱ࣇࣇ ൻԛ෱ૌ֥ো྘člua_typename ሇߐ၂۱ো྘઒֞ো྘଀Ď b ༯૫֥ݦඔ০Ⴈ stackDump ۷ࣉ၂֥҄ඪૼਔ API ؐᅜ֥Ҡቔb #include <stdio.h> #include <lua.h> static void stackDump (lua_State *L) { ... }
  186. Programming in Lua 186 Copyright ® 2005, Translation Team, www.luachina.net

    int main (void) { lua_State *L = lua_open(); lua_pushboolean(L, 1); lua_pushnumber(L, 10); lua_pushnil(L); lua_pushstring(L, "hello"); stackDump(L); /* true 10 nil `hello' */ lua_pushvalue(L, -4); stackDump(L); /* true 10 nil `hello' true */ lua_replace(L, 3); stackDump(L); /* true 10 true `hello' */ lua_settop(L, 6); stackDump(L); /* true 10 true `hello' nil nil */ lua_remove(L, -3); stackDump(L); /* true 10 true nil nil */ lua_settop(L, -5); stackDump(L); /* true */ lua_close(L); return 0; } 2 24 4. .3 3 C C A AP PI I ֥ ֥հ հ༂ ༂ԩ ԩ৘ ৘ ҂འ C++ࠇᆀ JAVA ၂ဢđC ე࿽ીႵิ܂၂ᇕၳӈԩ৘ࠏᇅbູਔڿ೿ᆃ۱଴ԩđ Lua ০Ⴈ C ֥ setjmp ࠯ెܒᄯਔ၂۱োරၳӈԩ৘֥ࠏᇅb čೂݔ୆Ⴈ C++টщၲ Luađ ପહྩڿս઒ၛ൐Ⴈᆇᆞ֥ၳӈѩ҂঒଴b Ď Lua ᇏ֥෮Ⴕࢲܒ׻൞׮෿֥ğ෱ૌοླᄹӉđቋᇔ֒ॖିൈႻ߶෪ࡨbၩ໅ሢଽ թٳ஥ാϧ֥ॖିྟᄝ Lua ᇏ൞௴ђ֥bࠫެ಩ၩҠቔ׻߶૫ؓᆃᇕၩຓbLua ֥ API ᇏႨၳӈؿԛᆃུհ༂ط҂൞ູૄ҄ҠቔӁളհ༂઒bᆃၩ໅ሢ෮Ⴕ֥ API ݦඔॖି஘ ԛ၂۱հ༂č္ࣼ൞טႨ longjmpĎটսْู߭b ֒໡ૌཿ၂۱९ս઒ൈč္ࣼ൞Ф Lua טႨ֥ C ݦඔĎӉ๋ሇčlong jumpĎ֥Ⴈԩ ࠫެބ၂۱ᆇᆞ֥ၳӈԩ৘၂ဢ֥ٚьđၹູ Lua ሂ౼ਔ಩ༀ୽ಖ֥հ༂b֒໡ૌཿႋ Ⴈӱ྽ս઒ൈč္ࣼ൞טႨ Lua ֥ C ս઒Ď đ໭ંೂޅđ໡ૌсྶิ܂၂ᇕٚمটሂ౼
  187. Programming in Lua 187 Copyright ® 2005, Translation Team, www.luachina.net

    ᆃུհ༂b 2 24 4. .3 3. .1 1 ႋ ႋႨ Ⴈӱ ӱ྽ ྽ᇏ ᇏ֥ ֥հ հ༂ ༂ԩ ԩ৘ ৘ ׅ྘֥౦ঃ൞ႋႨ֥ս઒ᄎྛᄝ٤Ќ޹ଆൔ༯b ႮႿႋႨ֥ս઒҂൞Ф Lua טႨ֥đ Lua ۴ऌഈ༯໓౦ঃটѽሚհ༂֥ؿളč္ࣼ൞ඪđLua ҂ିטႨ setjmpĎ bᄝᆃུ౦ঃ ༯đ֒ Lua მ֞ཞ "not enough memory" ֥հ༂đ෰҂ᆩ֡ೂޅԩ৘b෰ᆺିטႨ၂۱ panic ݦඔ๼ԛႋႨb č୆ॖၛ൐Ⴈ lua_atpanic ݦඔഡᇂ୆ሱ֥࠭ panic ݦඔĎ ҂൞෮Ⴕ֥ API ݦඔ׻߶஘ԛၳӈđlua_openalua_closealua_pcall ބ lua_load ׻൞ νಆ֥đਸ਼ຓđն؟ඔః෰ݦඔᆺିᄝଽթٳ஥ാϧ֥౦ঃ༯஘ԛၳӈğбೂđ luaL_loadfile ೂݔીႵቀܔଽթটॊНᆷק֥໓ࡱࡼ߶ാϧbႵུӱ྽֒ஷ֞ଽթ҂ቀ ൈđ෰ૌॖିླေޭ੻ၳӈ҂ቓ಩ޅԩ৘bؓᆃུӱ྽ط࿽đೂݔ Lua ֝ᇁଽթ҂ቀđ panic ൞ીႵ໙ี֥b ೂݔ୆҂མ୆֥ႋႨ๼ԛđࠧ൐ᄝଽթٳ஥ാϧ֥౦ঃ༯đ୆сྶᄝЌ޹ଆൔ༯ᄎ ྛ୆֥ս઒bն҆ٳࠇᆀ෮Ⴕ୆֥ Lua ս઒๙ݖטႨ lua_pcall টᄎྛđ෮ၛđ෱ᄎྛᄝ Ќ޹ଆൔ༯bࠧ൐ᄝଽթٳ஥ാϧ֥౦ঃ༯đlua_pcall ္ْ߭၂۱հ༂ս઒đ൐֤ lua ࢳ൤ఖԩႿބཾ֥čconsistentĎሑ෿bೂݔ୆္མЌ޹෮Ⴕ୆֥ა Lua ࢌ޺֥ C ս઒đ ୆ॖၛ൐Ⴈ lua_cpcallb č౨ुҕॉ൭ҨđႵؓᆃ۱ݦඔ۷ധ֥૭ඍđᄝ Lua ֥ؿ҃ϱ֥ lua.c ໓ࡱᇏႵ෱ႋႨ֥২ሰĎ 2 24 4. .3 3. .2 2 ো ো९ ९ᇏ ᇏ֥ ֥հ հ༂ ༂ԩ ԩ৘ ৘ Lua ൞νಆ֥ე࿽đ္ࣼ൞ඪđ҂ܵ୆ུ൉હဢ֥ս઒đ္҂ܵս઒ೂޅհ༂đ୆ ׻ॖၛ۴ऌ Lua Чദᆩ֡ӱ྽֥ྛູbਸ਼ຓđհ༂္߶۴ऌ Lua Фؿགྷބࢳ൤b୆ॖၛ ა C бࢠ၂༯đC ე࿽ᇏޓ؟հ༂֥ӱ྽֥ྛູᆺି၇ऌ႗ࡱࠇᆀႮӱ྽࠹ඔఖ۳ԛ֥ հ༂ԛགྷ໊֥ᇂФࢳ൤b ҂ં൉હൈީ୆ཟ Lua ᇏเࡆ၂۱ྍ֥ C ݦඔđ ୆׻ॖିյ௥ჰট֥νಆྟb бೂđ ၂۱োර poke ֥ݦඔđᄝ಩ၩ֥ଽթֹᆶթ٢಩ၩ֥ሳࢫđॖି൐֤ଽթคߓb୆сྶ མمഡمЌᆣ୆֥Ҭࡱ čadd-onsĎ ؓႿ Lua টࢃ൞νಆ֥đ ѩ౏ิۚбࢠݺ֥հ༂ԩ৘b ᆞೂ໡ૌభ૫෮ษં֥đૄ၂۱ C ӱ྽׻Ⴕ෰ሱ֥࠭հ໿ԩ৘ٚൔđ֒୆յෘູ Lua ཿ၂۱९ݦඔ֥ൈީđᆃ৚Ⴕ၂ུѓሙ֥ԩ৘հ༂֥ٚمॖၛҕॉb҂ં൉હൈީđ C ݦඔؿགྷհ༂ᆺေࡥֆ֥טႨ lua_errorčࠇᆀ luaL_errorđުᆀ۷ݺđၹູෲטႨਔభ ᆀѩ۬ൔ߄ਔհ༂ྐ༏Ď bLua_error ݦඔ߶ౢ৘෮Ⴕᄝ Lua ᇏླေФౢ৘֥đಖުބհ ༂ྐ༏၂ఏ߭֞ቋԚ֥ᆳྛ lua_pcall ֹ֥ٚb
  188. Programming in Lua 188 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 25 ᅣ ঔᅚ୆֥ӱ྽ ቔູ஥ᇂე࿽൞ LUA ֥၂۱ᇗေႋႨb ᄝᆃ۱ᅣࢫ৚,໡ૌई২ඪૼೂޅႨ LUA ഡ ᇂ၂۱ӱ྽bಞ໡ૌႨ၂۱ࡥֆ֥২ሰष൓ಖުᅚष֞۷گᄖ֥ႋႨᇏb ൮༵đಞ໡ૌམའ၂༯၂۱ࡥֆ֥஥ᇂ౦ࢫğ୆֥ C ӱ྽čӱ྽଀ູ PPĎႵ၂۱ Գ१ࢸ૫ѩ౏ॖၛಞႨ޼ᆷקԳ१֥Ԛ൓նཬbཁಖđোරᆃဢࡥֆ֥ႋႨđႵ؟ᇕࢳ थٚمб൐Ⴈ LUA ۷ࡥֆđбೂߌ࣢эਈࠇᆀթႵэਈᆴ֥໓ࡱb֌đࠧ൐൞Ⴈ၂۱ ࡥֆ֥໓Ч໓ࡱđ୆္҂ᆩ֡ೂޅಀࢳ༅b෮ၛđቋުथקҐႨ၂۱ LUA ஥ᇂ໓ࡱčᆃ ࣼ൞ LUA ӱ྽ᇏ֥Ղ໓Ч໓ࡱĎ b ᄝᆃᇕࡥֆ֥໓Чྙൔᇏ๙ӈЇݣোරೂ༯֥ྐ༏ྛğ -- configuration file for program `pp' -- define window size width = 200 height = 300 གྷᄝđ୆֤טႨ LUA API ݦඔಀࢳ༅ᆃ۱໓ࡱđ౼֤ width ބ height ᆃਆ۱ಆअэ ਈ֥ᆴb༯૫ᆃ۱౼ᆴݦඔࣼఏᆃဢ֥ቔႨğ #include <lua.h> #include <lauxlib.h> #include <lualib.h> void load (char *filename, int *width, int *height) { lua_State *L = lua_open(); luaopen_base(L); luaopen_io(L); luaopen_string(L); luaopen_math(L); if (luaL_loadfile(L, filename) || lua_pcall(L, 0, 0, 0)) error(L, "cannot run configuration file: %s", lua_tostring(L, -1)); lua_getglobal(L, "width"); lua_getglobal(L, "height"); if (!lua_isnumber(L, -2)) error(L, "`width' should be a number\n"); if (!lua_isnumber(L, -1))
  189. Programming in Lua 189 Copyright ® 2005, Translation Team, www.luachina.net

    error(L, "`height' should be a number\n"); *width = (int)lua_tonumber(L, -2); *height = (int)lua_tonumber(L, -1); lua_close(L); } ൮༵đӱ྽յष LUA Їѩࡆᄛਔѓሙݦඔ९čෙಖᆃ൞ॖ࿊֥đ֌๙ӈЇݣᆃུ ९൞бࢠݺ֥щӱනམĎ b ಖުӱ྽൐Ⴈ luaL_loadfile ٚم۴ऌҕඔ filename ࡆᄛՎ໓ࡱ ᇏ֥ྐ༏ॶѩטႨ lua_pcall ݦඔᄎྛđᆃུݦඔᄎྛൈ೏ؿളհ༂č২ೂ஥ᇂ໓ࡱᇏႵ ეمհ༂Ď đ ࡼْ߭٤ਬ֥հ༂ս઒ѩࡼՎհ༂ྐ༏࿢ೆᅜᇏb ๙ӈđ ໡ૌႨջҕඔ index ᆴູ-1 ֥ lua_tostring ݦඔ౼֤ᅜפჭ෍čerror ݦඔ໡ૌၘࣜᄝ 24.1 ᅣࢫᇏקၬĎ b ࢳ༅ປ౼֤֥ྐ༏ॶުđӱ྽߶౼֤ಆअэਈᆴbູՎđӱ྽טႨਔਆՑ lua_getglobal ݦඔđఃᇏ၂ҕඔູэਈ଀ӫbૄטႨ၂ՑࣼϜཌྷႋ֥эਈᆴ࿢ೆᅜפđ ෮ၛэਈ width ֥ index ᆴ൞-2 طэਈ height ֥ index ᆴ൞-1čᄝᅜפĎ b čၹູ༵భ֥ᅜ ൞ॢ֥đླေՖᅜָᇗྍ෬ႄđ1 іൕֻ၂۱ჭ෍ 2 іൕֻؽ۱ჭ෍bႮႿՖᅜפ෬ႄđ ҂ܵᅜ൞ڎູॢđ୆֥ս઒္ିᄎྛĎ bࢤሢđӱ྽Ⴈ lua_isnumber ݦඔ஑؎ૄ۱ᆴ൞ڎ ູඔሳblua_tonumber ݦඔࡼ֤֥֞ඔᆴሇߐӮ double ো྘ѩႨ(int)఼ᇅሇߐӮᆜ྘b ቋުđܱоඔऌੀѩْ߭ᆴb Lua ൞ڎᆴ֤၂Ⴈ?ᆞೂ໡భ૫ิ֥֞đᄝᆃ۱ࡥֆ֥২ሰᇏđཌྷбࢠႿ lua Ⴈ၂۱ ᆺЇݣႵਆ۱ඔሳ֥໓ࡱ߶۷ࡥֆbࠧ൐ೂՎđ൐Ⴈ lua ္ջটਔ၂ུႪ൝b൮༵đ෱ ູ୆ԩ৘෮Ⴕ֥ეم༥ࢫčЇওհ༂Ď Ġ୆֥஥ᇂ໓ࡱമᇀॖၛЇݣᇿ൤ĆఃՑđႨॖၛ Ⴈ lua ቓ۷؟گᄖ֥஥ᇂb২ೂđ࢖ЧॖၛཟႨ޼ิൕཌྷܱྐ༏đࠇᆀ္ॖၛҰ࿘ߌ࣢ эਈၛ࿊ᄴކൡ֥նཬğ -- configuration file for program 'pp' if getenv("DISPLAY") == ":0.0" then width = 300; height = 300 else width = 200; height = 200 end ᄝᆃဢࡥֆ֥஥ᇂ౦ࢫᇏđޓ଴ყਘႨ޼མေ൉હĠ҂ݖᆺေ࢖Чקၬਔᆃਆ۱э ਈđ୆֥ C ӱ྽໭ླڿэࣼॖᄎྛb ቋު၂۱൐Ⴈ lua ֥৘Ⴎğᄝ୆֥ӱ྽ᇏޓಸၞ֥ࡆೆྍ֥஥ᇂֆჭbٚь֥උྟ เࡆ൐ӱ྽۷ऎႵঔᅚྟb 2 25 5. .1 1 і іҠ Ҡቔ ቔ གྷᄝđ໡ૌյෘ൐Ⴈ Lua ቔູ஥ᇂ໓ࡱđ஥ᇂԳ१֥Мࣟ࿾೤b໡ૌࡌקቋᇔ֥࿾
  190. Programming in Lua 190 Copyright ® 2005, Translation Team, www.luachina.net

    ೤Ⴕ೘۱ඔሳčRGBĎ૭ඍđૄ၂۱ඔሳսі࿾೤֥၂҆ٳb๙ӈđᄝ C ე࿽ᇏđᆃུ ඔሳ൐Ⴈ[0,255]ٓຶଽ֥ᆜඔіൕđႮႿᄝ Lua ᇏ෮Ⴕඔሳ׻൞ൌඔđ໡ૌॖၛ൐Ⴈ۷ ሱಖ֥ٓຶ[0,1]টіൕb ၂۱ՙҡ֥ࢳथٚم൞đؓૄ၂۱࿾೤ቆࡱ൐Ⴈ၂۱ಆअэਈіൕđಞႨ޼ট஥ᇂ ᆃུэਈğ -- configuration file for program 'pp' width = 200 height = 300 background_red = 0.30 background_green = 0.10 background_blue = 0 ᆃ۱ٚمႵਆ۱ಌׄğֻ၂đ෾಺ჅčູਔіൕԳ१֥МࣟđԳ१֥భࣟđҒֆ֥ Мࣟ֩đ၂۱ൌ࠽֥ႋႨӱ྽ॖିླေࠫ൅۱҂๝֥࿾೤Ď ĠֻؽđીႵϷمყקၬ܋๝ ҆ٳ֥࿾೤đ бೂđ ࡌೂ໡ૌ൙༵קၬਔWHITEđ Ⴈ޼ॖၛࡥֆ֥ཿbackground = WHITE টіൕ෮Ⴕ֥Мࣟ೤ູϢ೤bູਔх૧ᆃུಌׄđ໡ૌ൐Ⴈ၂۱ table টіൕ࿾೤ğ background = {r=0.30, g=0.10, b=0} і֥൐Ⴈ۳࢖Ч֥ࢲܒջটޓ؟ਲࠃྟđགྷᄝؓႿႨ޼čࠇᆀႋႨӱ྽Ďޓಸၞყ קၬ၂ུ࿾೤đၛьࡼটᄝ஥ᇂᇏ൐Ⴈğ BLUE = {r=0, g=0, b=1} ... background = BLUE ູਔᄝ C ᇏࠆ౼ᆃུᆴđ໡ૌᆃဢቓğ lua_getglobal(L, "background"); if (!lua_istable(L, -1)) error(L, "`background' is not a valid color table"); red = getfield("r"); green = getfield("g"); blue = getfield("b"); ၂Ϯটඪđ໡ૌ൮༵ࠆ౼ಆअэਈ backgroud ֥ᆴđѩЌᆣ෱൞၂۱ tablebಖުđ ໡ૌ൐Ⴈ getfield ݦඔࠆ౼ૄ၂۱࿾೤ቆࡱbᆃ۱ݦඔ҂൞ API ֥၂҆ٳđ໡ૌླေሱ ࠭קၬ෰ğ #define MAX_COLOR 255 /* assume that table is on the stack top */ int getfield (const char *key) {
  191. Programming in Lua 191 Copyright ® 2005, Translation Team, www.luachina.net

    int result; lua_pushstring(L, key); lua_gettable(L, -2); /* get background[key] */ if (!lua_isnumber(L, -1)) error(L, "invalid component in background color"); result = (int)lua_tonumber(L, -1) * MAX_COLOR; lua_pop(L, 1); /* remove number */ return result; } ᆃ৚໡ૌᄜՑ૫ؓ؟෿֥໙ีğॖିթᄝޓ؟۱ getfield ֥ϱЧđkey ֥ো྘đvalue ֥ো྘đհ༂ԩ৘֩׻҂࣐ཌྷ๝bLua API ᆺิ܂ਔ၂۱ lua_gettable ݦඔđ෰ࢤ൳ table ᄝᅜᇏ໊֥ᇂູҕඔđࡼؓႋ key ᆴԛᅜđْ߭ა key ؓႋ֥ valueb ໡ૌഈ૫֥ getfield ݦඔࡌק table ᄝᅜפđၹՎđlua_pushstring ࡼ key ೆᅜᆭުđtable ᄝ-2 ໊֥ᇂbْ߭ ᆭభđgetfield ߶ࡼᅜ߫گ֞טႨభ֥ሑ෿b ໡ૌؓഈ૫֥২ሰ഍ቔ࿼ഥđࡆೆ࿾೤଀bႨ޼ಯಖॖၛ൐Ⴈ࿾೤ tableđ֌൞္ॖ ၛູ܋๝҆ٳ֥࿾೤ყקၬ଀ሳđູਔൌགྷᆃ۱ۿିđ໡ૌᄝ C ս઒ᇏླေ၂۱࿾೤ tableğ struct ColorTable { char *name; unsigned char red, green, blue; } colortable[] = { {"WHITE", MAX_COLOR, MAX_COLOR, MAX_COLOR}, {"RED", MAX_COLOR, 0, 0}, {"GREEN", 0, MAX_COLOR, 0}, {"BLUE", 0, 0, MAX_COLOR}, {"BLACK", 0, 0, 0}, ... {NULL, 0, 0, 0} /* sentinel */ }; ໡ૌ֥ᆃ۱ൌགྷ߶൐Ⴈ࿾೤଀Էࡹ၂۱ಆअэਈđ ಖު൐Ⴈ࿾೤ table Ԛ൓߄ᆃུಆ अэਈbࢲݔބႨ޼ᄝ࢖Чᇏ൐Ⴈ༯૫ᆃࠫྛս઒൞၂ဢ֥ğ WHITE = {r=1, g=1, b=1} RED = {r=1, g=0, b=0} ... ࢖ЧᇏႨ޼קၬ֥࿾೤ބႋႨᇏčC ս઒Ďקၬ֥࿾೤҂๝ᆭԩᄝႿğႋႨᄝ࢖Ч ᆭభᄎྛb ູਔॖၛഡᇂ table თ֥ᆴđ໡ૌקၬ۱ڣᇹݦඔ setfieldĠᆃ۱ݦඔࡼ field ֥෬ႄ
  192. Programming in Lua 192 Copyright ® 2005, Translation Team, www.luachina.net

    ބ field ֥ᆴೆᅜđಖުטႨ lua_settableğ /* assume that table is at the top */ void setfield (const char *index, int value) { lua_pushstring(L, index); lua_pushnumber(L, (double)value/MAX_COLOR); lua_settable(L, -3); } აః෰֥ API ݦඔ၂ဢđlua_settable ᄝ҂๝֥ҕඔো྘౦ঃ༯׻ॖၛ൐Ⴈđ෰Ֆᅜ ᇏࠆ౼෮Ⴕ֥ҕඔb lua_settable ၛ table ᄝᅜᇏ֥෬ႄቔູҕඔđ ѩࡼᅜᇏ֥ key ބ value ԛᅜđႨᆃਆ۱ᆴྩڿ tablebSetfield ݦඔࡌקטႨᆭభ table ൞ᄝᅜפ໊ᇂ(෬ႄູ-1)b ࡼ index ބ value ೆᅜᆭުđtable ෬ႄэູ-3b Setcolor ݦඔקၬ၂۱ֆ၂֥࿾೤đ൮༵Էࡹ၂۱ tableđಖުഡᇂؓႋ֥თđಖު ࡼᆃ۱ table ڮᆴ۳ؓႋ֥ಆअэਈğ void setcolor (struct ColorTable *ct) { lua_newtable(L); /* creates a table */ setfield("r", ct->red); /* table.r = ct->r */ setfield("g", ct->green); /* table.g = ct->g */ setfield("b", ct->blue); /* table.b = ct->b */ lua_setglobal(ct->name); /* 'name' = table */ } lua_newtable ݦඔԷࡹ၂۱ྍ֥ॢ table ಖުࡼఃೆᅜđ טႨ setfield ഡᇂ table ֥თđ ቋު lua_setglobal ࡼ table ԛᅜѩࡼఃڮ۳၂۱ಆअэਈ଀b Ⴕਔభ૫ᆃུݦඔđ༯૫֥࿖ߌᇿҨ෮Ⴕ֥࿾೤֞ႋႨӱ྽ᇏ֥ಆअэਈğ int i = 0; while (colortable[i].name != NULL) setcolor(&colortable[i++]); ࠺ᇾğႋႨӱ྽сྶᄝᄎྛႨ޼࢖Чᆭభđᆳྛᆃ۱࿖ߌb ؓႿഈ૫֥ଁ଀࿾೤֥ൌགྷႵਸ਼ຓ၂۱ॖ࿊֥ٚمbႨ၂۱ሳژԱটіൕ࿾೤଀đ ط҂൞ഈ૫൐ႨಆअэਈіൕđбೂႨ޼ॖၛᆃဢഡᇂ background = "BLUE"b෮ၛđ background ॖၛ൞ table ္ॖၛ൞ stringbؓႿᆃᇕൌགྷđႋႨӱ྽ᄝᄎྛႨ޼࢖Чᆭభ ҂ླေቓ಩ޅห൹ԩ৘b֌൞ླေحຓ֥۽ቔটࠆ౼࿾೤b֒෰֤֞эਈ background ֥ ᆴᆭުđсྶ஑؎ᆃ۱ᆴ֥ো྘đ൞ table ߎ൞ stringğ lua_getglobal(L, "background"); if (lua_isstring(L, -1)) { const char *name = lua_tostring(L, -1); int i = 0;
  193. Programming in Lua 193 Copyright ® 2005, Translation Team, www.luachina.net

    while (colortable[i].name != NULL && strcmp(colorname, colortable[i].name) != 0) i++; if (colortable[i].name == NULL) /* string not found? */ error(L, "invalid color name (%s)", colorname); else { /* use colortable[i] */ red = colortable[i].red; green = colortable[i].green; blue = colortable[i].blue; } } else if (lua_istable(L, -1)) { red = getfield("r"); green = getfield("g"); blue = getfield("b"); } else error(L, "invalid value for `background'"); ଧ۱൞ቋݺ֥࿊ᄴ଻Ĥᄝ C ӱ྽ᇏđ൐ႨሳژԱіൕ҂൞၂۱ݺ֥༝ܸđၹູщၲ ఖ҂߶ؓሳژԱࣉྛհ༂࡟Ұbಖطᄝ Lua ᇏđಆअэਈ҂ླေലૼđၹՎ֒Ⴈ޼ࡼ࿾ ೤଀ሳ௓ཿհ༂֥ൈީđ Lua ҂߶ؿԛ಩ޅհ༂ྐ༏b бೂđ Ⴈ޼ࡼ WHITE ༂ཿӮ WITEđ background эਈࡼູ nil(WITE ֥ᆴીႵԚ൓߄)đಖުႋႨӱ྽ࣼಪູ background ֥ᆴ ູ nilb ીႵః෰ܱႿᆃ۱հ༂֥ྐ༏ॖၛࠆ֤b ਸ਼၂ٚ૫đ ൐ႨሳژԱіൕđ background ֥ᆴ္ॖି൞௓ཿհਔ֥ሳژԱbၹՎđႋႨӱ྽ॖၛᄝؿളհ༂֥ൈީđקᇅൻԛ֥ հ༂ྐ༏bႋႨॖၛ҂౵ٳնཬཿбࢠሳژԱđၹՎđႨ޼ॖၛཿ"white"đ"WHITE"đ മᇀ"White"b֌൞đೂݔႨ޼࢖Чޓཬđѩ౏࿾೤ᇕোбࢠ؟đᇿҨӮϤഈత۱࿾೤(ླ ေԷࡹӮϤഈత۱ table ބಆअэਈ)đቋᇔႨ޼ॖିᆺ൞Ⴈఃᇏࠫ۱đᆃ߶ಞದत֤ޓ ܯၳbᄝ൐ႨሳژԱіൕ֥ൈީđႋх૧ᆃᇕ౦ঃԛགྷb 2 25 5. .2 2 ט טႨ Ⴈ L Lu ua a ݦ ݦඔ ඔ Lua ቔູ஥ᇂ໓ࡱ֥၂۱ቋն֥ӉԩᄝႿ෱ॖၛקၬ۱ФႋႨטႨ֥ݦඔbбೂđ ୆ॖၛཿ၂۱ႋႨӱ྽ট߻ᇅ၂۱ݦඔ֥๭ཞđ൐Ⴈ Lua টקၬᆃ۱ݦඔb ൐Ⴈ API טႨݦඔ֥ٚم൞ޓࡥֆ֥ğ൮༵đࡼФטႨ֥ݦඔೆᅜĠֻؽđ၇Ցࡼ ෮ႵҕඔೆᅜĠֻ೘đ൐Ⴈ lua_pcall טႨݦඔĠቋުđՖᅜᇏࠆ౼ݦඔᆳྛْ֥߭ࢲݔb ु၂۱২ሰđࡌק໡ૌ֥஥ᇂ໓ࡱႵ༯૫ᆃ۱ݦඔğ function f (x, y) return (x^2 * math.sin(y))/(1 - x) end
  194. Programming in Lua 194 Copyright ® 2005, Translation Team, www.luachina.net

    ѩ౏໡ૌམᄝ C ᇏؓႿ۳ק֥ x,y ࠹ෘ z=f(x,y)֥ᆴbࡌೂ୆ၘࣜյषਔ lua ९ѩ౏ ᄎྛਔ஥ᇂ໓ࡱđ୆ॖၛࡼᆃ۱טႨٿልӮ༯૫֥ C ݦඔğ /* call a function `f' defined in Lua */ double f (double x, double y) { double z; /* push functions and arguments */ lua_getglobal(L, "f"); /* function to be called */ lua_pushnumber(L, x); /* push 1st argument */ lua_pushnumber(L, y); /* push 2nd argument */ /* do the call (2 arguments, 1 result) */ if (lua_pcall(L, 2, 1, 0) != 0) error(L, "error running function `f': %s", lua_tostring(L, -1)); /* retrieve result */ if (!lua_isnumber(L, -1)) error(L, "function `f' must return a number"); z = lua_tonumber(L, -1); lua_pop(L, 1); /* pop returned value */ return z; } ॖၛטႨ lua_pcall ൈᆷקҕඔ֥۱ඔބْ߭ࢲݔ֥۱ඔbֻඹ۱ҕඔॖၛᆷק၂۱ հ༂ԩ৘ݦඔđ໡ૌ༯૫ᄜษં෱bބ Lua ᇏڮᆴҠቔ၂ဢđlua_pcall ߶۴ऌ୆֥ေ౰ טᆜْ߭ࢲݔ֥۱ඔđ؟Ⴥ֥שఙđഒ֥Ⴈ nil Ҁቀbᄝࡼࢲݔೆᅜᆭభđlua_pcall ߶ࡼ ᅜଽ֥ݦඔބҕඔ၍Ԣbೂݔݦඔْ߭؟۱ࢲݔđֻ၂۱ࢲݔФֻ၂۱ೆᅜđၹՎೂݔ Ⴕ n ۱ْ߭ࢲݔđֻ၂۱ْ߭ࢲݔᄝᅜᇏ໊֥ᇂູ-nđቋު၂۱ْ߭ࢲݔᄝᅜᇏ໊֥ᇂ ູ-1b ೂݔ lua_pcall ᄎྛൈԛགྷհ༂đlua_pcall ߶ْ߭၂۱٤ 0 ֥ࢲݔbਸ਼ຓđ෰ࡼհ༂ ྐ༏ೆᅜčಯಖ߶༵ࡼݦඔބҕඔՖᅜᇏ၍ԢĎ bᄝࡼհ༂ྐ༏ೆᅜᆭభđೂݔᆷקਔհ ༂ԩ৘ݦඔđlua_pcall ߮וႨհ༂ԩ৘ݦඔb൐Ⴈ lua_pcall ֥ቋު၂۱ҕඔটᆷקհ༂ ԩ৘ݦඔđ0 սіીႵհ༂ԩ৘ݦඔđ္ࣼ൞ඪቋᇔ֥հ༂ྐ༏ࣼ൞ჰ൓֥հ༂ྐ༏b ڎᄵđପ۱ҕඔႋھ൞၂۱հ༂ݦඔФࡆᄛ֥ൈީᄝᅜᇏ֥෬ႄđᇿၩđᄝᆃᇕ౦ঃ༯đ հ༂ԩ৘ݦඔсྶေᄝФטႨݦඔބఃҕඔೆᅜᆭభೆᅜb ؓႿ၂Ϯհ༂đlua_pcall ْ߭հ༂ս઒ LUA_ERRRUNbႵਆᇕห൹౦ঃđ߶ْ߭ ห൹֥հ༂ս઒đၹູ෰ૌՖট҂߶טႨհ༂ԩ৘ݦඔbֻ၂ᇕ౦ঃ൞đଽթٳ஥հ༂đ ؓႿᆃᇕհ༂đlua_pcall ሹ൞ْ߭ LUA_ERRMEMbֻؽᇕ౦ঃ൞đ֒ Lua ᆞᄝᄎྛհ
  195. Programming in Lua 195 Copyright ® 2005, Translation Team, www.luachina.net

    ༂ԩ৘ݦඔൈؿളհ༂đᆃᇕ౦ঃ༯đᄜՑטႨհ༂ԩ৘ݦඔીႵၩၬđ෮ၛ lua_pcall ৫ْࠧ߭հ༂ս઒ LUA_ERRERRb 2 25 5. .3 3 ๙ ๙Ⴈ Ⴈ֥ ֥ݦ ݦඔ ඔט טႨ Ⴈ ु၂۱഍ັ֥ۚࠩ২ሰđ໡ૌ൐Ⴈ C ֥ vararg টٿልؓ Lua ݦඔ֥טႨb໡ૌ֥ٿ ልު֥ݦඔčcall_vaĎࢤ൳ФטႨ֥ݦඔૼቔֻູ၂۱ҕඔđֻؽҕඔ൞၂۱૭ඍҕඔ ބࢲݔো྘֥ሳژԱđቋު൞၂۱Ќթْ߭ࢲݔ֥эਈᆷᆌ֥ਙіb൐Ⴈᆃ۱ݦඔđ໡ ૌॖၛࡼభ૫֥২ሰڿཿູğ call_va("f", "dd>d", x, y, &z); ሳژԱ "dd>d" іൕݦඔႵਆ۱ double ো྘֥ҕඔđ၂۱ double ো྘ْ֥߭ࢲݔb ໡ૌ൐Ⴈሳଛ 'd' іൕ doubleĠ'i' іൕ integerđ's' іൕ stringsĠ'>' ቔູҕඔބࢲݔ֥ ٳۯژbೂݔݦඔીႵْ߭ࢲݔđ'>' ൞ॖ࿊֥b #include <stdarg.h> void call_va (const char *func, const char *sig, ...) { va_list vl; int narg, nres; /* number of arguments and results */ va_start(vl, sig); lua_getglobal(L, func); /* get function */ /* push arguments */ narg = 0; while (*sig) { /* push arguments */ switch (*sig++) { case 'd': /* double argument */ lua_pushnumber(L, va_arg(vl, double)); break; case 'i': /* int argument */ lua_pushnumber(L, va_arg(vl, int)); break; case 's': /* string argument */ lua_pushstring(L, va_arg(vl, char *)); break;
  196. Programming in Lua 196 Copyright ® 2005, Translation Team, www.luachina.net

    case '>': goto endwhile; default: error(L, "invalid option (%c)", *(sig - 1)); } narg++; luaL_checkstack(L, 1, "too many arguments"); } endwhile: /* do the call */ nres = strlen(sig); /* number of expected results */ if (lua_pcall(L, narg, nres, 0) != 0) /* do the call */ error(L, "error running function `%s': %s", func, lua_tostring(L, -1)); /* retrieve results */ nres = -nres; /* stack index of first result */ while (*sig) { /* get results */ switch (*sig++) { case 'd': /* double result */ if (!lua_isnumber(L, nres)) error(L, "wrong result type"); *va_arg(vl, double *) = lua_tonumber(L, nres); break; case 'i': /* int result */ if (!lua_isnumber(L, nres)) error(L, "wrong result type"); *va_arg(vl, int *) = (int)lua_tonumber(L, nres); break; case 's': /* string result */ if (!lua_isstring(L, nres)) error(L, "wrong result type"); *va_arg(vl, const char **) = lua_tostring(L, nres); break;
  197. Programming in Lua 197 Copyright ® 2005, Translation Team, www.luachina.net

    default: error(L, "invalid option (%c)", *(sig - 1)); } nres++; } va_end(vl); } ࣐ܵᆃ؍ս઒ऎႵ၂Ϯྟđ ᆃ۱ݦඔބభ૫໡ૌ֥২ሰႵཌྷ๝֥҄ᇧğ ࡼݦඔೆᅜđ ҕඔೆᅜđטႨݦඔđࠆ౼ْ߭ࢲݔbն҆ٳս઒׻ޓᆰܴđ֌္Ⴕ၂ׄ࠯ెb൮༵đ ҂ླေ࡟Ұ func ൞ڎ൞၂۱ݦඔđlua_pcall ॖၛѽሚᆃ۱հ༂bֻؽđॖၛࢤ൳಩ၩ؟ ۱ҕඔđ෮ၛсྶ࡟Ұᅜ֥ॢࡗbֻ೘đၹູݦඔॖିْ߭ሳژԱđcall_va ҂ିՖᅜᇏ ֐ԛࢲݔđᄝטႨᆀࠆ౼ਢൈሳژԱ֥ࢲݔᆭުčॊН֞ః෰֥эਈᇏĎ đႮטႨᆀڵᄳ ֐ԛࢲݔb
  198. Programming in Lua 198 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 26 ᅣ טႨ C ݦඔ ঔᅚ Lua ֥ࠎЧٚمᆭ၂ࣼ൞ູႋႨӱ྽ᇿҨྍ֥ C ݦඔ֞ Lua ᇏಀb ֒໡ૌิ֞ Lua ॖၛטႨ C ݦඔđ ҂൞ᆷ Lua ॖၛטႨ಩ޅো྘֥ C ݦඔ čႵ၂ུ Їॖၛಞ Lua טႨ಩ၩ֥ C ݦඔđ֌ಌكьࢮބࡲሐྟĎ bᆞೂ໡ૌభ૫෮ु֥֞đ֒ C טႨ Lua ݦඔ֥ൈީđ сྶ቎࿖၂ུࡥֆ֥ླྀၰটԮ־ҕඔބࠆ౼ْ߭ࢲݔb ཌྷර֥đ Ֆ Lua ᇏטႨ C ݦඔđ္сྶ቎࿖၂ུླྀၰটԮ־ҕඔބࠆْ֤߭ࢲݔbਸ਼ຓđՖ Lua טႨ C ݦඔ໡ૌсྶᇿҨݦඔđ္ࣼ൞ඪđ໡ૌсྶϜ C ݦඔֹ֥ᆶၛ၂۱ൡ֥֒ٚൔ Ԯ־۳ Lua ࢳ൤ఖb ֒ Lua טႨ C ݦඔ֥ൈީđ൐Ⴈބ C טႨ Lua ཌྷ๝ো྘֥ᅜটࢌ޺bC ݦඔՖᅜᇏ ࠆ౼ෲ֥ҕඔđ טႨࢲඏުࡼْ߭ࢲݔ٢֞ᅜᇏb ູਔ౵ٳْ߭ࢲݔބᅜᇏ֥ః෰֥ᆴđ ૄ۱ C ݦඔߎ߶ْ߭ࢲݔ֥۱ඔčthe function returns (in C) the number of results it is leaving on the stack.Ď bᆃظႵ၂۱ᇗေ֥ۀ୑ğႨটࢌ޺֥ᅜ҂൞ಆअэਈđૄ၂۱ݦ ඔ׻Ⴕ෰ሱ֥࠭඲Ⴕᅜb֒ Lua טႨ C ݦඔ֥ൈީđֻ၂۱ҕඔሹ൞ᄝᆃ۱඲Ⴕᅜ֥ index=1 ໊֥ᇂbമᇀ֒၂۱ C ݦඔטႨ Lua ս઒čLua ս઒טႨ๝၂۱ C ݦඔࠇᆀః ෰֥ C ݦඔĎ đૄ၂۱ C ݦඔ׻Ⴕሱ֥࠭׿৫֥඲Ⴕᅜđѩ౏ֻ၂۱ҕඔᄝ index=1 ֥ ໊ᇂb 2 26 6. .1 1 C C ݦ ݦඔ ඔ ༵ु၂۱ࡥֆ֥২ሰđೂޅൌགྷ၂۱ࡥֆ֥ݦඔْ߭۳קඔᆴ֥ sin ᆴč۷ህြ֥ ൌགྷႋھ࡟Ұ෰֥ҕඔ൞ڎູ၂۱ඔሳĎ ğ static int l_sin (lua_State *L) { double d = lua_tonumber(L, 1); /* get argument */ lua_pushnumber(L, sin(d)); /* push result */ return 1; /* number of results */ } ಩ޅᄝ Lua ᇏᇿҨ֥ݦඔсྶႵ๝ဢ֥ჰ྘đᆃ۱ჰ྘ലૼקၬࣼ൞ lua.h ᇏ֥ lua_CFunctionğ typedef int (*lua_CFunction) (lua_State *L); Ֆ C ֥࢘؇টुđ၂۱ C ݦඔࢤ൳ֆ၂֥ҕඔ Lua stateđْ߭၂۱іൕْ߭ᆴ۱ඔ ֥ඔሳb෮ၛđݦඔᄝࡼْ߭ᆴೆᅜᆭభ҂ླေౢ৘ᅜđݦඔْ߭ᆭުđLua ሱ׮֥ౢ Ԣᅜᇏْ߭ࢲݔ༯૫֥෮Ⴕଽಸb ໡ ૌ ေ མ ᄝ Lua ൐ Ⴈ ᆃ ۱ ݦ ඔ đ ߎ с ྶ ൮ ༵ ᇿ Ҩ ᆃ ۱ ݦ ඔ b ໡ ૌ ൐ Ⴈ
  199. Programming in Lua 199 Copyright ® 2005, Translation Team, www.luachina.net

    lua_pushcfunction টປӮᆃ۱಩ༀğ෰ࠆ౼ᆷཟ C ݦඔ֥ᆷᆌđѩᄝ Lua ᇏԷࡹ၂۱ function ো྘֥ᆴটіൕᆃ۱ݦඔb ၂۱ quick-and-dirty ֥ࢳथٚσ൞ࡼᆃ؍ս઒ᆰࢤ٢ ֞ lua.c ໓ࡱᇏđѩᄝטႨ lua_open ު૫ൡ໊֥֒ᇂࡆഈ༯૫ਆྛğ lua_pushcfunction(l, l_sin); lua_setglobal(l, "mysin"); ֻ၂ྛࡼো྘ູ function ֥ᆴೆᅜđֻؽྛࡼ function ڮᆴ۳ಆअэਈ mysinbᆃဢ ྩڿᆭުđᇗྍщၲ Luađ୆ࣼॖၛᄝ୆֥ Lua ӱ྽ᇏ൐Ⴈྍ֥ mysin ݦඔਔbᄝ༯૫ ၂ࢫđ໡ૌࡼษંၛбࢠݺ֥ٚمࡼྍ֥ C ݦඔเࡆ֞ Lua ᇏಀb ؓႿ഍ັህြ֥ׄ sin ݦඔđ໡ૌсྶ࡟Ұ sin ֥ҕඔ֥ো྘bႵ၂۱ڣᇹ९ᇏ֥ luaL_checknumber ݦඔॖၛ࡟Ұ۳ק֥ҕඔ൞ڎູඔሳğ֒Ⴕհ༂ؿള֥ൈީđࡼ஘ԛ ၂۱հ༂ྐ༏Ġڎᄵْ߭ቔູҕඔ֥ପ۱ඔሳbࡼഈ૫໡ૌ֥ݦඔ഍ቔྩڿğ static int l_sin (lua_State *L) { double d = luaL_checknumber(L, 1); lua_pushnumber(L, sin(d)); return 1; /* number of results */ } ۴ऌഈ૫֥קၬđೂݔ୆טႨ mysin('a'),߶֤֞ೂ༯ྐ༏ğ bad argument #1 to 'mysin' (number expected, got string) ᇿၩुु luaL_checknumber ൞ೂޅሱ׮൐Ⴈğҕඔ numberč1Ď đݦඔ଀č"mysin"Ď đ ௹ຬ֥ҕඔো྘č"number"Ď đൌ࠽֥ҕඔো྘č"string"Ďট௓ࢤቋᇔ֥հ༂ྐ༏֥b ༯૫ु၂۱഍ັگᄖ֥২ሰğཿ၂۱ْ߭۳קଢ੣ଽಸ֥ݦඔbLua ֥ѓሙ९ѩી Ⴕิ܂ᆃ۱ݦඔđၹູ ANSI C ીႵॖၛൌགྷᆃ۱ۿି֥ݦඔbᄝᆃظđ໡ૌࡌק໡ૌ ֥༢๤ژކ POSIX ѓሙb໡ૌ֥ dir ݦඔࢤ൳၂۱սіଢ੣ਫ਼֥ࣥሳژԱቔູҕඔđၛ ඔቆ֥ྙൔْ߭ଢ੣֥ଽಸbбೂđטႨ dir("/home/lua")ॖିْ߭{".", "..", "src", "bin", "lib"}b֒Ⴕհ༂ؿള֥ൈީđݦඔْ߭ nil ࡆഈ၂۱૭ඍհ༂ྐ༏֥ሳژԱb #include <dirent.h> #include <errno.h> static int l_dir (lua_State *L) { DIR *dir; struct dirent *entry; int i; const char *path = luaL_checkstring(L, 1); /* open directory */ dir = opendir(path);
  200. Programming in Lua 200 Copyright ® 2005, Translation Team, www.luachina.net

    if (dir == NULL) { /* error opening the directory? */ lua_pushnil(L); /* return nil and ... */ lua_pushstring(L, strerror(errno)); /* error message */ return 2; /* number of results */ } /* create result table */ lua_newtable(L); i = 1; while ((entry = readdir(dir)) != NULL) { lua_pushnumber(L, i++); /* push key */ lua_pushstring(L, entry->d_name); /* push value */ lua_settable(L, -3); } closedir(dir); return 1; /* table is already on top */ } ڣᇹ९֥ luaL_checkstring ݦඔႨট࡟ҩҕඔ൞ڎູሳژԱđა luaL_checknumber োරb čᄝࠞ؊౦ঃ༯đഈ૫֥ l_dir ֥ൌགྷॖି߶֝ᇁཬ֥ଽթ྄੐bטႨ֥೘۱ Lua ݦඔ lua_newtablealua_pushstring ބ lua_settable ॖିႮႿીႵቀܔ֥ଽթطാϧbఃᇏ ಩ޅ၂۱טႨാϧ׻߶஘ԛհ༂ѩ౏ᇔᆸ l_dirđᆃᇕ౦ঃ༯đ҂߶טႨ closedirbᆞೂ భ૫໡ૌ෮ษંݖ֥đؓႿն؟ඔӱ྽টඪᆃ҂ෘ۱໙ีğೂݔӱ྽֝ᇁଽթ҂ቀđቋ ݺ֥ԩ৘ٚൔ൞৫ࠧᇔᆸӱ྽b ਸ਼ຓđ ᄝ 29 ᅣ໡ૌࡼु֞ਸ਼ຓ၂ᇕࢳथٚσॖၛх૧ᆃ ۱໙ี֥ؿളĎ 2 26 6. .2 2 C C ݦ ݦඔ ඔ९ ९ ၂۱ Lua ९ൌ࠽ഈ൞၂۱קၬਔ၂༢ਙ Lua ݦඔ֥ chunkđѩࡼᆃུݦඔЌթᄝൡ ֹ֥֒ٚđ๙ӈቔູ table ֥თটЌթbLua ֥ C ९ࣼ൞ᆃဢൌགྷ֥bԢਔקၬ C ݦඔ ᆭຓđߎсྶקၬ၂۱ห൹֥Ⴈটބ Lua ९֥ᇶ chunk ๙ྐ֥ห൹ݦඔb၂֊טႨđᆃ ۱ݦඔࣼ߶ᇿҨ९ᇏ෮Ⴕ֥ C ݦඔđѩࡼ෰ૌЌթ֞ൡ໊֥֒ᇂbཞ၂۱ Lua ᇶ chunk ၂ဢđෲ္߶Ԛ൓߄ః෰၂ུᄝ९ᇏླေԚ൓߄֥ת༆b Lua ๙ݖᆃ۱ᇿҨݖӱđࣼॖၛु֞९ᇏ֥ C ݦඔb၂֊၂۱ C ݦඔФᇿҨᆭުѩ Ќթ֞ Lua ᇏđᄝ Lua ӱ྽ᇏࣼॖၛᆰࢤႄႨ෰ֹ֥ᆶč֒໡ૌᇿҨᆃ۱ݦඔ֥ൈީԮ ־۳ Lua ֹ֥ᆶĎট٠໙ᆃ۱ݦඔਔbߐओ߅ඪđ၂֊ C ݦඔФᇿҨᆭުđLua טႨᆃ ۱ݦඔѩ҂၇ঠႿݦඔ଀đЇ໊֥ᇂđࠇᆀטႨݦඔ֥ॖ࡮֥ܿᄵb๙ӈ C ९׻Ⴕ၂۱ ຓ҆čpublic/externĎ֥Ⴈটյष९֥ݦඔbః෰֥ݦඔॖି׻൞඲Ⴕ֥đᄝ C ᇏФലૼ
  201. Programming in Lua 201 Copyright ® 2005, Translation Team, www.luachina.net

    ູ staticb ֒୆յෘ൐Ⴈ C ݦඔটঔᅚ Lua ֥ൈީđࠧ൐୆ࣇࣇᆺམᇿҨ၂۱ C ݦඔđࡼ୆֥ C ս઒ഡ࠹ູ၂۱९൞۱бࢠݺ֥නམğ҂ࣲ֥ࡼট୆ࣼ߶ؿགྷ୆ླေః෰֥ݦඔb၂ Ϯ౦ঃ༯đڣᇹ९ؓᆃᇕൌགྷิ܂ਔϺᇹbluaL_openlib ݦඔࢤ൳၂۱ C ݦඔ֥ਙіބ ෰ૌؓႋ֥ݦඔ଀đѩ౏ቔູ၂۱९ᄝ၂۱ table ᇏᇿҨ෮Ⴕᆃུݦඔbु၂۱২ሰđࡌ ק໡ૌམႨ၂۱໡ૌభ૫ิݖ֥ l_dir ݦඔԷࡹ၂۱९b൮༵đ໡ૌсྶקၬ९ݦඔğ static int l_dir (lua_State *L) { ... /* as before */ } ֻؽ҄đ໡ૌലૼ၂۱ඔቆđЌթ෮Ⴕ֥ݦඔބ෰ૌؓႋ֥଀ሳbᆃ۱ඔቆ֥ჭ෍ ো྘ູ luaL_regğ൞၂۱ջႵਆ۱თ֥ࢲܒุđ၂۱ሳژԱބ၂۱ݦඔᆷᆌb static const struct luaL_reg mylib [] = { {"dir", l_dir}, {NULL, NULL} /* sentinel */ }; ᄝ໡ૌ֥২ሰᇏđ ᆺႵ၂۱ݦඔ l_dir ླေലૼb ᇿၩඔቆᇏቋު၂ؓсྶ൞{NULL, NULL}đႨটіൕࢲඏbֻ೘҄đ໡ૌ൐Ⴈ luaL_openlib ലૼᇶݦඔğ int luaopen_mylib (lua_State *L) { luaL_openlib(L, "mylib", mylib, 0); return 1; } luaL_openlib ֻ֥ؽ۱ҕඔ൞९֥଀ӫbᆃ۱ݦඔοᅶᆷק֥଀ሳԷࡹ(ࠇᆀ reuse) ၂۱іđѩ൐Ⴈඔቆ mylib ᇏ֥ name-function ؓแԉᆃ۱іbluaL_openlib ߎᄍྸ໡ૌ ູ९ᇏ෮Ⴕ֥ݦඔᇿҨ܄܋֥ upvaluesb২ሰᇏ҂ླေ൐Ⴈ upvaluesđ෮ၛቋު၂۱ҕ ඔູ 0bluaL_openlib ْ֥߭ൈީđࡼЌթ९֥і٢֞ᅜଽbluaL_openlib ݦඔْ߭ 1đ ْ߭ᆃ۱ᆴ۳ Luab čThe luaopen_mylib function returns 1 to return this value to LuaĎ čބ Lua ९၂ဢđᆃ۱ْ߭ᆴ൞ॖ࿊֥đၹູ९Чദၘࣜڮ۳ਔ၂۱ಆअэਈbਸ਼ຓđཞᄝ Lua ѓሙ९ᇏ֥၂ဢđᆃ۱ْ߭҂߶Ⴕحຓ֥޽ٮđᄝႵൈީॖି൞ႵႨ֥b Ď ປӮ९֥ս઒щཿᆭުđ໡ૌсྶࡼ෱৽ࢤ֞ Lua ࢳ൤ఖbቋӈႨ֥ٚൔ൐Ⴈ׮෿ ৵ࢤ९đೂݔ୆֥ Lua ࢳ൤ఖᆦӻᆃ۱หྟ֥߅č໡ૌᄝ 8.2 ࢫၘࣜษંݖਔ׮෿৵ࢤ ९Ď b ᄝᆃᇕ౦ঃ༯đ ୆сྶႨ୆֥ս઒Էࡹ׮෿৵ࢤ९ čwindows ༯.dll ໓ࡱđ linux ༯.so ໓ࡱĎ b֞ᆃ၂҄đ୆ࣼॖၛᄝ Lua ᇏᆰࢤ൐Ⴈ loadlib ࡆᄛ୆ېҌקၬ֥ݦඔ९ਔđ༯ ૫ᆃ۱טႨğ mylib = loadlib("fullname-of-your-library", "luaopen_mylib") ࡼ luaopen_mylib ݦඔሇߐӮ Lua ᇏ֥၂۱ C ݦඔđѩࡼᆃ۱ݦඔڮᆴ۳ mylibčପ ࣼ൞ູ൉હ luaopen_mylib сྶބః෰֥ C ݦඔႵཌྷ๝֥ჰ྘֥ჰၹ෮ᄝĎ bಖުđטႨ
  202. Programming in Lua 202 Copyright ® 2005, Translation Team, www.luachina.net

    mylib()đࡼᄎྛ luaopen_mylib յष୆קၬ֥ݦඔ९b ೂݔ୆֥ࢳ൤ఖ҂ᆦӻ׮෿৽ࢤ९đ୆сྶࡼ୆֥ྍ֥ݦඔ९ᇗྍщၲ֞୆֥ Lua ᇏಀbԢਔᆃၛຓđߎ҂ေ၂ུٚൔۡු׿৫ᄎྛ֥ Lua ࢳ൤ఖđ֒෰յष၂۱ྍ֥ሑ ෿֥ൈީсྶյषᆃ۱ྍקၬ֥ݦඔ९bޡקၬॖၛޓಸၞൌགྷᆃ۱ۿିbֻ၂đ୆с ྶ൐Ⴈ༯૫֥ଽಸԷࡹ၂۱๨໓ࡱč໡ૌॖၛӫᆭູ mylib.hĎ ğ int luaopen_mylib (lua_State *L); #define LUA_EXTRALIBS { "mylib", luaopen_mylib }, ֻ၂ྛലૼਔյष९֥ݦඔbֻؽྛקၬਔ၂۱ޡ LUA_EXTRALIBS ቔູݦඔඔ ቆ֥ྍ֥ೆ१đ֒ࢳ൤ఖԷࡹྍ֥ሑ෿֥ൈީ߶טႨᆃ۱ޡb čᆃ۱ݦඔඔቆ֥ো྘ູ struct luaL_reg[]đၹՎ໡ૌླေࡼ଀ሳ္٢ࣉಀĎ ູ ਔ ᄝ ࢳ ൤ ఖ ᇏ Ї ݣ ᆃ ۱ ๨ ໓ ࡱ đ ୆ ॖ ၛ ᄝ ୆ ֥ щ ၲ ࿊ ཛ ᇏ ק ၬ ၂ ۱ ޡ LUA_USERCONFIGbؓႿଁ਷ྛ֥щၲఖđ୆ᆺླเࡆ၂۱༯૫ᆃဢ֥࿊ཛࠧॖğ -DLUA_USERCONFIG=\"mylib.h\" čّོཌٝᆸචႄݼФ shell ࢳ൤đ֒໡ૌᄝ C ᇏᆷק၂۱๨໓ࡱൈđᆃུႄݼ൞ сླ֥b Ďᄝ၂۱ᆜކ֥षؿߌ࣢ᇏđ୆сྶᄝ۽ӱഡᇂᇏเࡆোර֥ת༆bಖު֒୆ᇗ ྍщၲ lua.c ֥ൈީđ෱Їݣ mylib.hđѩ౏ၹՎᄝݦඔ९֥ਙіᇏॖၛႨྍקၬ֥ LUA_EXTRALIBS টյषݦඔ९b
  203. Programming in Lua 203 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 27 ᅣ ለཿ C ݦඔ֥࠯ె ֥ܲٚ API ބڣᇹݦඔ९ ׻ิ܂ਔ၂ུϺᇹӱ྽ჴೂޅཿݺ C ݦඔ֥ࠏᇅbᄝᆃ ၂ᅣ໡ૌࡼษંඔቆҠሺastring ԩ৘aᄝ C ᇏթԥ Lua ᆴ֩၂ུห൹֥ࠏᇅb 2 27 7. .1 1 ඔ ඔቆ ቆҠ Ҡቔ ቔ Lua ᇏඔቆൌ࠽ഈࣼ൞ၛห൹ٚൔ൐Ⴈ֥ table ֥љ଀b ໡ૌॖၛ൐Ⴈ಩ޅҠሺ table ֥ݦඔটؓඔቆҠቔđ ࠧ lua_settable ބ lua_gettableb ಖطđ ა Lua ӈܿࡥࢱනམ čeconomy and simplicityĎཌྷّ֥൞đAPI ູඔቆҠቔิ܂ਔ၂ུห൹֥ݦඔbᆃဢቓ֥ჰၹԛႿ ྟି֥ॉ੮ğၹູ໡ૌࣜӈᄝ၂۱ෘمčбೂஆ྽Ď֥࿖ߌ֥ଽҪ٠໙ඔቆđ෮ၛᆃᇕ ଽҪҠቔ֥ྟି֥ิۚ߶ؓᆜุ֥ྟି֥ڿ೿Ⴕޓն֥႕ཙb API ิ܂ਔ༯૫ਆ۱ඔቆҠቔݦඔğ void lua_rawgeti (lua_State *L, int index, int key); void lua_rawseti (lua_State *L, int index, int key); ܱႿ֥ lua_rawgeti ބ lua_rawseti ֥૭ඍႵུ൐ದ޴๰đၹູ෱ടࠣ֞ਆ۱෬ႄğ index ᆷཟ table ᄝᅜᇏ໊֥ᇂĠkey ᆷཟჭ෍ᄝ table ᇏ໊֥ᇂb֒ t ൐Ⴈڵ෬ႄ֥ൈީ čotherwiseđyou must compensate for the new item in the stackĎ đטႨ lua_rawgeti(L,t,key) ֩ࡎႿğ lua_pushnumber(L, key); lua_rawget(L, t); טႨ lua_rawseti(L, t, key)č္ေ౰ t ൐Ⴈڵ෬ႄĎ֩ࡎႿğ lua_pushnumber(L, key); lua_insert(L, -2); /* put 'key' below previous value */ lua_rawset(L, t); ᇿၩᆃਆ۱ݥඅ׻൞Ⴈ raw Ҡቔđ෰ૌ֥෎؇ࢠॹđሹᆭđႨቔඔቆ֥ table ޓഒ൐ Ⴈ metamethodsb ༯૫ुೂޅ൐Ⴈᆃུݦඔ֥ऎุ֥২ሰđ໡ૌࡼభ૫֥ l_dir ݦඔ֥࿖ߌุğ lua_pushnumber(L, i++); /* key */ lua_pushstring(L, entry->d_name); /* value */ lua_settable(L, -3); ڿཿູğ
  204. Programming in Lua 204 Copyright ® 2005, Translation Team, www.luachina.net

    lua_pushstring(L, entry->d_name); /* value */ lua_rawseti(L, -2, i++); /* set table at key 'i' */ ༯૫൞၂۱۷ປᆜ֥২ሰđ༯૫֥ս઒ൌགྷਔ map ݦඔğၛඔቆ֥ૄ၂۱ჭ෍ູҕ ඔטႨ၂۱ᆷק֥ݦඔđѩࡼඔቆ֥ھჭ෍ูߐູטႨݦඔْ֥߭ࢲݔb int l_map (lua_State *L) { int i, n; /* 1st argument must be a table (t) */ luaL_checktype(L, 1, LUA_TTABLE); /* 2nd argument must be a function (f) */ luaL_checktype(L, 2, LUA_TFUNCTION); n = luaL_getn(L, 1); /* get size of table */ for (i=1; i<=n; i++) { lua_pushvalue(L, 2); /* push f */ lua_rawgeti(L, 1, i); /* push t[i] */ lua_call(L, 1, 1); /* call f(t[i]) */ lua_rawseti(L, 1, i); /* t[i] = result */ } return 0; /* no results */ } ᆃ৚૫ႄೆਔ೘۱ྍ֥ݦඔbluaL_checktypečᄝ lauxlib.h ᇏקၬĎႨট࡟Ұ۳ק֥ ҕඔႵᆷק֥ো྘Ġ ڎᄵ஘ԛհ༂b luaL_getn ݦඔᅜᇏᆷק໊ᇂ֥ඔቆ֥նཬ čtable.getn ൞טႨ luaL_getn টປӮ۽ቔ֥Ď blua_call ֥ᄎྛ൞໭Ќ޹֥đ෰ა lua_pcall ཌྷරđ֌ ൞ᄝհ༂ؿള֥ൈީෲ஘ԛհ༂ط҂൞ْ߭հ༂ս઒b֒୆ᄝႋႨӱ྽ᇏཿᇶੀӱ֥ս ઒ൈđ҂ႋھ൐Ⴈ lua_callđၹູ୆ႋھѽሚ಩ޅॖିؿള֥հ༂b֒୆ཿ၂۱ݦඔ֥ս ઒ൈđ൐Ⴈ lua_call ൞бࢠݺ֥མمđೂݔႵհ༂ؿളđϜհ༂਽۳ܱྏෲ֥ದಀԩ৘b 2 27 7. .2 2 ሳ ሳژ ژԱ Աԩ ԩ৘ ৘ ֒ C ݦඔࢤ൳၂۱টሱ lua ֥ሳژԱቔູҕඔൈđႵਆ۱ܿᄵсྶ቎൯ğ֒ሳژԱ ᆞᄝФ٠໙֥ൈީ҂ေࡼఃԛᅜĠႥჹ҂ေྩڿሳژԱb ֒ C ݦඔླေԷࡹ၂۱ሳژԱْ߭۳ lua ֥ൈީđ౦ঃэ֤۷ࡆگᄖbᆃဢླေႮ C ս઒টڵᄳߏԊ౵֥ٳ஥ބ൤٢đڵᄳԩ৘ߏԊၮԛ֩౦ঃbಖطđLua API ิ܂ਔ
  205. Programming in Lua 205 Copyright ® 2005, Translation Team, www.luachina.net

    ၂ུݦඔটϺᇹ໡ૌԩ৘ᆃུ໙ีb ѓሙ API ิ܂ਔؓਆᇕࠎЧሳژԱҠቔ֥ᆦӻğሰԱࢩ౼ބሳژԱ৵ࢤb࠺ᇾđ lua_pushlstring ॖၛࢤ൳၂۱حຓ֥ҕඔđሳژԱ֥Ӊ؇টൌགྷሳژԱ֥ࢩ౼đ෮ၛđೂ ݔ୆མࡼሳژԱ s Ֆ i ֞ j ໊ᇂčЇݣ i ބ jĎ֥ሰԱԮ־۳ luađᆺླေğ lua_pushlstring(L, s+i, j-i+1); ༯૫ᆃ۱২ሰđࡌೂ୆མཿ၂۱ݦඔট۴ऌᆷק֥ٳۯژٳ۩၂۱ሳژԱđѩْ߭ ၂۱Ќթ෮ႵሰԱ֥ tableđбೂטႨğ split("hi,,there", ",") ႋھْ߭і{"hi", "", "there"}b໡ૌॖၛࡥֆ֥ൌགྷೂ༯đ༯૫ᆃ۱ݦඔ҂ླေحຓ ֥ߏԊ౵đॖၛԩ৘ሳژԱ֥Ӊ؇္ીႵཋᇅb static int l_split (lua_State *L) { const char *s = luaL_checkstring(L, 1); const char *sep = luaL_checkstring(L, 2); const char *e; int i = 1; lua_newtable(L); /* result */ /* repeat for each separator */ while ((e = strchr(s, *sep)) != NULL) { lua_pushlstring(L, s, e-s); /* push substring */ lua_rawseti(L, -2, i++); s = e + 1; /* skip separator */ } /* push last substring */ lua_pushstring(L, s); lua_rawseti(L, -2, i); return 1; /* return the table */ } ᄝ Lua API ᇏิ܂ਔህ૊֥Ⴈট৵ࢤሳژԱ֥ݦඔ lua_concatb֩ࡎႿ Lua ᇏ֥..Ҡ ቔژğሱ׮ࡼඔሳሇߐӮሳژԱđೂݔႵсေ֥ൈީߎ߶ሱ׮טႨ metamethodsbਸ਼ຓđ ෲॖၛ๝ൈ৵ࢤ؟۱ሳژԱbטႨ lua_concat(L,n)ࡼ৵ࢤ(๝ൈ߶ԛᅜ)ᅜפ֥ n ۱ᆴđѩ ࡼቋᇔࢲݔ٢֞ᅜפb ਸ਼၂۱ႵႨ֥ݦඔ൞ lua_pushfstringğ
  206. Programming in Lua 206 Copyright ® 2005, Translation Team, www.luachina.net

    const char *lua_pushfstring (lua_State *L, const char *fmt, ...); ᆃ۱ݦඔଖᇕӱ؇ഈোරႿ C ე࿽ᇏ֥ sprintfđ۴ऌ۬ൔԱ fmt ֥ေ౰Էࡹ၂۱ྍ ֥ሳژԱbა sprintf ҂๝֥൞đ୆҂ླေิ܂၂۱ሳژԱߏԊඔቆđLua ູ୆׮෿֥Է ࡹྍ֥ሳژԱđο෰ൌ࠽ླေ֥նཬb္҂ླေքྏߏԊ౵ၮԛ֩໙ีbᆃ۱ݦඔ߶ࡼ ࢲݔሳژԱ٢֞ᅜଽđѩْ߭၂۱ᆷཟᆃ۱ࢲݔԱ֥ᆷᆌb֒భđᆃ۱ݦඔᆺᆦӻ༯ਙ ࠫ۱ᆷൕژğ %%čіൕሳژ '%'Ď a%sčႨট۬ൔ߄ሳژԱĎ a%dč۬ൔ߄ᆜඔĎ a%f č۬ൔ߄ Lua ඔሳđࠧ doublesĎބ %cčࢤ൳၂۱ඔሳѩࡼఃቔູሳژĎ đ҂ᆦӻॺ؇ ބࣚ؇֩࿊ཛb ֒໡ૌյෘ৵ࢤഒਈ֥ሳژԱ֥ൈީđlua_concat ބ lua_pushfstring ൞ޓႵႨ֥đಖ طđೂݔ໡ૌླေ৵ࢤնਈ֥ሳژԱčࠇᆀሳژĎ đᆃᇕ၂۱၂۱֥৵ࢤٚൔིੱ൞ޓ֮ ֥đᆞೂ໡ૌᄝ 11.6 ࢫु֥֞ପဢb໡ૌॖၛ൐Ⴈڣᇹ९ิ܂֥ buffer ཌྷܱݦඔটࢳथ ᆃ۱໙ีb Auxlib ᄝਆ۱ҪՑഈൌགྷਔᆃུ bufferb ֻ၂۱ҪՑোරႿ I/O Ҡቔ֥ buffersğ ࠢᇏ෮Ⴕ֥ሳژԱčࠇᆀ֌۱ሳژĎ٢֞၂۱Чֹ buffer ᇏđ֒Чֹ buffer ડ֥ൈީࡼ ఃԮ־۳ Luač൐Ⴈ lua_pushlstringĎ bֻؽ۱ҪՑ൐Ⴈ lua_concat ބ໡ૌᄝ 11.6 ࢫᇏु ֥֞ପ۱ᅜෘم֥эุđট৵ࢤ؟۱ buffer ֥ࢲݔb ູਔ۷བྷ༥ֹ૭ඍ Auxlib ᇏ֥ buffer ֥൐Ⴈđ໡ૌটु၂۱ࡥֆ֥ႋႨb༯૫ᆃ؍ ս઒ཁൕਔ string.upper ֥ൌགྷčটሱ໓ࡱ lstrlib.cĎ ğ static int str_upper (lua_State *L) { size_t l; size_t i; luaL_Buffer b; const char *s = luaL_checklstr(L, 1, &l); luaL_buffinit(L, &b); for (i=0; i<l; i++) luaL_putchar(&b, toupper((unsigned char)(s[i]))); luaL_pushresult(&b); return 1; } ൐Ⴈ Auxlib ᇏ buffer ֻ֥၂҄൞൐Ⴈো྘ luaL_Buffer ലૼ၂۱эਈđಖުטႨ luaL_buffinit Ԛ൓߄ᆃ۱эਈbԚ൓߄ᆭުđbuffer Ќ਽ਔ၂ٺሑ෿ L ֥ॊНđၹՎ֒໡ ૌטႨః෰Ҡቔ buffer ֥ݦඔ֥ൈީ҂ླေԮ־ Lbޡ luaL_putchar ࡼ၂۱ֆ۱ሳژ٢ ೆ bufferbAuxlib ္ิ܂ਔ luaL_addlstring ၛ၂۱ཁൕ֥Ӊ؇ࡼ၂۱ሳژԱ٢ೆ bufferđ ط luaL_addstring ࡼ၂۱ၛ 0 ࢲແ֥ሳژԱ٢ೆ bufferb ቋުđ luaL_pushresult ඗ྍ buffer ѩࡼቋᇔሳژԱ٢֞ᅜפbᆃུݦඔ֥ჰ྘ೂ༯ğ void luaL_buffinit (lua_State *L, luaL_Buffer *B); void luaL_putchar (luaL_Buffer *B, char c);
  207. Programming in Lua 207 Copyright ® 2005, Translation Team, www.luachina.net

    void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l); void luaL_addstring (luaL_Buffer *B, const char *s); void luaL_pushresult (luaL_Buffer *B); ൐Ⴈᆃུݦඔđ໡ૌ҂ླေքྏ buffer ֥ٳ஥đၮԛ֩བྷ༥ྐ༏bᆞೂ໡ૌ෮ु֞ ֥đ৵ࢤෘم൞Ⴕི֥bݦඔ str_upper ॖၛݸ໭໙ี֥ԩ৘նሳژԱčնႿ 1MBĎ b ֒୆൐Ⴈauxlibᇏ֥bufferൈđ҂сքྏ၂ׄ༥ࢫ໙ีb୆ᆺေࡼת༆٢ೆbufferđӱ ྽߶ሱ׮ᄝLuaᅜᇏЌթᇏࡗࢲݔb෮ၛđ୆҂ေಪູᅜפ߶Ќӻ୆ष൓൐Ⴈbuffer֥ପ ۱ሑ෿b ਸ਼ຓđ ෙಖ୆ॖၛᄝ൐Ⴈbuffer֥ൈީđ ࡼᅜႨቔః෰Ⴈ๯đ ֌ૄՑ୆٠໙buffer ֥ൈީđᆃུః෰Ⴈ๯֥Ҡቔࣉྛ֥push/popҠቔсྶЌӻ௜ޙ6bႵ၂ᇕ౦ঃđࠧ୆յ ෘࡼՖLuaْ֥߭ሳژԱ٢ೆbufferൈđᆃᇕ౦ঃ༯đᆃུཋᇅႵུݖႿ࿸۬bᆃᇕ౦ঃ ༯đᄝࡼሳژԱ٢ೆbufferᆭభđ҂ିࡼሳژԱԛᅜđၹູ၂֊୆ՖᅜᇏࡼটሱႿLua֥ ሳژԱ၍ԛđ୆ࣼႥჹ҂ି൐Ⴈᆃ۱ሳژԱb๝ൈđᄝࡼ၂۱ሳژԱԛᅜᆭభđ୆္҂ ିܔࡼః٢ೆbufferđၹູପဢ߶ࡼᅜᇂႿհ༂֥ҪՑčbecause then the stack would be in the wrong levelĎ bߐओ߅ඪ୆҂ିቓোර༯૫֥൙౦ğ luaL_addstring(&b, lua_tostring(L, 1)); /* BAD CODE */ čၲᆀğഈ૫ᆞݺܒӮਔ၂ؓ઱؛Ď đႮႿᆃᇕ౦ঃ൞ޓӈ࡮֥đauxlib ิ܂ਔห൹ ֥ݦඔটࡼ໊Ⴟᅜפ֥ᆴ٢ೆ bufferğ void luaL_addvalue (luaL_Buffer *B); ֒ಖđೂݔ໊Ⴟᅜפ֥ᆴ҂൞ሳژԱࠇᆀඔሳ֥߅đטႨᆃ۱ݦඔࡼ߶ԛհb 2 27 7. .3 3 ᄝ ᄝ C C ݦ ݦඔ ඔᇏ ᇏЌ Ќթ թሑ ሑ෿ ෿ ๙ӈটඪđC ݦඔླေЌ਽၂ུ٤अ֥҆ඔऌđ္ࣼ൞ᆷପུӑݖ෰ૌቔႨٓຶ֥ ඔऌbC ე࿽ᇏ໡ૌ൐Ⴈಆअэਈࠇᆀ static эਈটડቀᆃᇕླေbಖط֒୆ູ Lua ഡ ࠹၂۱ӱ྽९֥ൈީđಆअэਈބ static эਈ҂൞၂۱ݺ֥ٚمb൮༵đ҂ିࡼ෮Ⴕ֥ č၂Ϯၩၬ֥đჰ໓ genericĎLua ᆴЌթ֞၂۱ C эਈᇏbֻؽđ൐Ⴈᆃᇕэਈ֥९҂ ିᄝ؟۱ Lua ሑ෿֥౦ঃ༯൐Ⴈb ၂۱ูս֥ࢳथٚσ൞ࡼᆃུᆴЌթ֞၂۱ Lua ಆअэਆᇕđᆃᇕٚمࢳथਔభ૫ ֥ਆ۱໙ีbLua ಆअэਈॖၛթ٢಩ޅো྘֥ Lua ᆴđѩ౏ૄ၂۱׿৫֥ሑ෿׻Ⴕ෰ ሱ࠭׿৫֥ಆअэਈࠢbಖطđѩ҂൞ᄝ෮Ⴕ౦ঃ༯đᆃᇕٚم׻൞਷ದડၩֹࢳथٚ σđ ၹູ Lua ս઒ॖି߶ྩڿᆃུಆअэਈđ າࠣ C ඔऌ֥ປᆜྟb ູਔх૧ᆃ۱໙ีđ Lua ิ܂ਔ၂۱׿৫֥Фӫູ registry ֥іđC ս઒ॖၛሱႮ൐Ⴈđ֌ Lua ս઒҂ି٠໙ ෰b 6 ၲᇿğࠧႵ؟ഒՑpushࣼေႵ؟ഒՑpopb
  208. Programming in Lua 208 Copyright ® 2005, Translation Team, www.luachina.net

    2 27 7. .3 3. .1 1 T Th he e R Re eg gi is st tr ry y registry ၂ᆰ ໊ Ⴟ ၂ ۱ Ⴎ LUA_REGISTRYINDEX ק ၬ ֥ ᆴ ෮ ؓ ႋ ֥ ࡌ ෬ ႄ (pseudo-index)໊֥ᇂb၂۱ࡌ෬ႄԢਔ෰ؓႋ֥ᆴ҂ᄝᅜᇏᆭຓđః෰׻োරႿᅜᇏ֥ ෬ႄbLua API ᇏն҆ٳࢤ൳෬ႄቔູҕඔ֥ݦඔđ္׻ॖၛࢤ൳ࡌ෬ႄቔູҕඔiԢ ਔପུҠቔᅜЧദ֥ݦඔđ бೂ lua_removeđ lua_insertb ২ೂđ ູਔࠆ౼ၛ࡯ᆴ "Key" Ќ թᄝ registry ᇏ֥ᆴđ൐Ⴈ༯૫֥ս઒ğ lua_pushstring(L, "Key"); lua_gettable(L, LUA_REGISTRYINDEX); registry ࣼ൞௴๙֥ Lua іđ ၹՎđ ୆ॖၛ൐Ⴈ಩ޅ٤ nil ֥ Lua ᆴট٠໙ෲ֥ჭ෍b ಖطđႮႿ෮Ⴕ֥ C ९܋ཚཌྷ๝֥ registry đ୆сྶᇿၩ൐Ⴈ൉હဢ֥ᆴቔູ keyđڎ ᄵ߶֝ᇁଁ଀Ԋ๬b၂۱ٝᆸଁ଀Ԋ๬֥ٚم൞൐Ⴈ static эਈֹ֥ᆶቔູ keyğC ৽ࢤ ఖЌᆣᄝ෮Ⴕ֥९ᇏᆃ۱ key ൞ື၂֥b ݦඔ lua_pushlightuserdata ࡼ၂۱սі C ᆷᆌ֥ ᆴ٢֞ᅜଽđ༯૫֥ս઒ᅚൕਔ൐Ⴈഈ૫ᆃ۱ٚمđೂޅՖ registry ᇏࠆ౼эਈބཟ registry թԥэਈğ /* variable with an unique address */ static const char Key = 'k'; /* store a number */ lua_pushlightuserdata(L, (void *)&Key); /* push address */ lua_pushnumber(L, myNumber); /* push value */ /* registry[&Key] = myNumber */ lua_settable(L, LUA_REGISTRYINDEX); /* retrieve a number */ lua_pushlightuserdata(L, (void *)&Key); /* push address */ lua_gettable(L, LUA_REGISTRYINDEX); /* retrieve value */ myNumber = lua_tonumber(L, -1); /* convert to number */ ໡ૌ߶ᄝ 28.5 ࢫᇏ۷བྷ༥֥ษં light userdatab ֒ಖđ୆္ॖၛ൐ႨሳژԱቔູ registry ֥ keyđᆺေ୆ЌᆣᆃུሳژԱື၂b֒୆ յෘᄍྸః෰֥׿৫९ٜ໙୆֥ඔऌ֥ൈީđሳژԱ྘֥ key ൞٤ӈႵႨ֥đၹູ෰ૌ ླေᆩ֡ key ֥଀ሳbؓᆃᇕ౦ঃđીႵ൉હٚمॖၛधؓٝᆸ଀ӫԊ๬đ֌Ⴕ၂ུݺ ֥༝ܸॖၛҐႨđ бೂ൐Ⴈ९֥଀ӫቔູሳژԱ֥భሗ֩োර֥ٚمb োර lua ࠇᆀ lualib ֥భሗ҂൞၂۱ݺ֥࿊ᄴbਸ਼၂۱ॖ࿊֥ٚم൞൐Ⴈ universal unique identifierčuuidĎ đ ޓ؟༢๤׻Ⴕህ૊֥ӱ྽টӁളᆃᇕѓൕژčбೂ linux ༯֥ uuidgenĎ b၂۱ uuid ൞၂ ۱ႮЧࠏ IP ֹᆶaൈࡗՄaބ၂۱ෛࠏଽಸቆކఏট֥ 128 ໊֥ඔሳčၛ 16 ࣉᇅ֥ٚ ൔ඀ཿđႨটྙӮ၂۱ሳژԱĎ đၹՎ෱აః෰֥ uuid ҂๝൞ॖၛЌᆣ֥b
  209. Programming in Lua 209 Copyright ® 2005, Translation Team, www.luachina.net

    2 27 7. .3 3. .2 2 R Re ef fe er re en nc ce es s ୆ႋھ࠺ᇾđ Ⴅჹ҂ေ൐Ⴈඔሳቔູ registry ֥ keyđ ၹູᆃᇕো྘֥ key ൞Ќ਽۳ reference ༢๤൐ႨbReference ༢๤൞Ⴎڣᇹ९ᇏ֥၂ؓݦඔቆӮđᆃؓݦඔႨট҂ླေ քྏ଀ӫԊ๬֥ࡼᆴЌթ֞ registry ᇏಀb čൌ࠽ഈđᆃུݦඔॖၛႨႿ಩ޅ၂۱іđ֌ ෰ૌׅ྘֥ФႨႿ registryĎ טႨ int r = luaL_ref(L, LUA_REGISTRYINDEX); Ֆᅜᇏ֐ԛ၂۱ᆴđၛ၂۱ྍ֥ඔሳቔູ key ࡼఃЌթ֞ registry ᇏđѩْ߭ᆃ۱ keyb໡ૌࡼᆃ۱ key ӫᆭູ referenceb ܤ଀නၬđ໡ૌ൐Ⴈ references ᇶေႨႿğࡼ၂۱ᆷཟ Lua ᆴ֥ reference թԥ֞၂ ۱ C ࢲܒุᇏbᆞೂభ૫໡ૌ෮࡮֥֞đ໡ૌႥჹ҂ေࡼ၂۱ᆷཟ Lua ሳژԱ֥ᆷᆌЌ թ֞ࠆ౼ᆃ۱ሳژԱ֥ຓ֥҆ C ݦඔᇏbਸ਼ຓđLua മᇀ҂ิ܂ᆷཟః෰ؓའ֥ᆷᆌđ бೂ table ࠇᆀݦඔbၹՎđ໡ૌ҂ି๙ݖᆷᆌᆷཟ Lua ؓའb֒໡ૌླေᆃᇕᆷᆌ֥ൈ ީđ໡ૌԷࡹ၂۱ reference ѩࡼఃЌթᄝ C ᇏb ေམࡼ၂۱ reference ֥ؓႋ֥ᆴೆᅜđᆺླေğ lua_rawgeti(L, LUA_REGISTRYINDEX, r); ቋުđ໡ૌטႨ༯૫֥ݦඔ൤٢ᆴބ referenceğ luaL_unref(L, LUA_REGISTRYINDEX, r); טႨᆃ۱ᆭުđluaL_ref ॖၛᄜՑْ߭ r ቔູ၂۱ྍ֥ referenceb reference ༢๤ࡼ nil ቔູห൹౦ঃؓրđ ҂ܵ൉હൈީđ ୆ၛ nil טႨ luaL_ref ֥߅đ ҂߶Էࡹ၂ྍ֥ reference đط൞ْ߭၂۱ӈਈ reference LUA_REFNILb༯૫֥טႨી Ⴕིݔğ luaL_unref(L, LUA_REGISTRYINDEX, LUA_REFNIL); ಖط lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_REFNIL); ཞყ௹֥၂ဢđࡼ၂۱ nil ೆᅜb reference ༢๤္קၬਔӈਈ LUA_NOREFđ ෲ൞၂۱іൕ಩ޅ٤Ⴕི֥ reference ֥ ᆜඔᆴđႨটѓ࠺໭ི֥ referenceb಩ޅఒ๭ࠆ౼ LUA_NOREF ْ߭ nilđ಩ޅ൤٢෰ ֥Ҡቔ׻ીႵིݔb 2 27 7. .3 3. .3 3 U Up pv va al lu ue es s registry ൌགྷਔಆअ֥ᆴđ upvalue ࠏᇅൌགྷਔა C static эਈ֩ࡎ֥תתđ ᆃᇕэਈ
  210. Programming in Lua 210 Copyright ® 2005, Translation Team, www.luachina.net

    ᆺିᄝหק֥ݦඔଽॖ࡮bૄ֒୆ᄝ Lua ᇏԷࡹ၂۱ྍ֥ C ݦඔđ୆ॖၛࡼᆃ۱ݦඔა ಩ၩ؟۱ upvalues ৳༢ఏটđૄ၂۱ upvalue ॖၛӻႵ၂۱ֆ׿֥ Lua ᆴb༯૫֒ݦඔ ФטႨ֥ൈީđॖၛ๙ݖࡌ෬ႄሱႮ֥٠໙಩ޅ၂۱ upvaluesb ໡ૌӫᆃᇕ၂۱ C ݦඔބෲ֥ upvalues ֥ቆކູоЇčclosureĎ b࠺ᇾğᄝ Lua ս ઒ᇏđ၂۱оЇ൞၂۱Ֆຓ҆ݦඔ٠໙अ҆эਈ֥ݦඔb၂۱ C оЇა၂۱ Lua оЇཌྷ ࣍bܱႿоЇ֥၂۱Ⴕ౿֥൙ൌ൞đ୆ॖၛ൐Ⴈཌྷ๝֥ݦඔս઒Էࡹ҂๝֥оЇđջႵ ҂๝֥ upvaluesb ु၂۱ࡥֆ֥২ሰđ໡ૌᄝ C ᇏԷࡹ၂۱ newCounter ݦඔb č໡ૌၘࣜᄝ 6.1 ࢫ҆ ٳᄝ Lua ᇏקၬݖ๝ဢ֥ݦඔĎ bᆃ۱ݦඔ൞۱ݦඔ۽ӌğૄՑטႨ෰׻ْ߭၂۱ྍ֥ counter ݦඔb࣐ܵ෮Ⴕ֥ counters ܋ཚཌྷ๝֥ C ս઒đ֌൞ૄ۱׻Ќ਽׿৫֥ counter эਈđ۽ӌݦඔೂ༯ğ /* forward declaration */ static int counter (lua_State *L); int newCounter (lua_State *L) { lua_pushnumber(L, 0); lua_pushcclosure(L, &counter, 1); return 1; } ᆃ৚֥ܱ࡯ݦඔ൞ lua_pushcclosuređෲֻ֥ؽ۱ҕඔ൞၂۱ࠎЧݦඔč২ሰᇏ໏ counterĎ đֻ೘۱ҕඔ൞ upvalues ֥۱ඔč২ሰᇏູ 1Ď bᄝԷࡹྍ֥оЇᆭభđ໡ૌс ྶࡼ upvalues ֥Ԛ൓ᆴೆᅜđᄝ໡ૌ֥২ሰᇏđ໡ૌࡼඔሳ 0 ቔູື၂֥ upvalue ֥Ԛ ൓ᆴೆᅜbೂყ௹֥၂ဢđlua_pushcclosure ࡼྍ֥оЇ٢֞ᅜଽđၹՎоЇၘࣜቔູ newCounter ֥ࢲݔФْ߭b གྷᄝđ໡ૌुु counter ֥קၬğ static int counter (lua_State *L) { double val = lua_tonumber(L, lua_upvalueindex(1)); lua_pushnumber(L, ++val); /* new value */ lua_pushvalue(L, -1); /* duplicate it */ lua_replace(L, lua_upvalueindex(1)); /* update upvalue */ return 1; /* return new value */ } ᆃ৚֥ܱ࡯ݦඔ൞ lua_upvalueindexčൌ࠽൞၂۱ޡĎ đႨটӁള၂۱ upvalue ֥ࡌ ෬ႄbᆃ۱ࡌ෬ႄԢਔ҂ᄝᅜᇏᆭຓđބః෰֥෬ႄ၂ဢbіղൔ lua_upvalueindex(1) ݦඔֻ၂۱ upvalue ֥෬ႄbၹՎđᄝݦඔ counter ᇏ֥ lua_tonumber ࠆ౼ֻ၂۱(ࣇႵ ֥)upvalue ֥֒భᆴđሇߐູඔሳ྘bಖުđݦඔ counter ࡼྍ֥ᆴ++val ೆᅜđѩࡼᆃ ۱ᆴ֥၂۱ॊН൐Ⴈྍ֥ᆴูߐ upvaluebቋުđْ߭ః෰֥ॊНb
  211. Programming in Lua 211 Copyright ® 2005, Translation Team, www.luachina.net

    ა Lua оЇ҂๝֥൞đC оЇ҂ି܋ཚ upvaluesğૄ၂۱оЇ׻Ⴕሱ࠭׿৫֥эਈ ࠢbಖطđ໡ૌॖၛഡᇂ҂๝ݦඔ֥ upvalues ᆷཟ๝၂۱іđᆃဢᆃ۱іࣼэӮਔ၂۱ ෮Ⴕݦඔ܋ཚඔऌֹ֥ٚb
  212. Programming in Lua 212 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 28 ᅣ User-Defined Types in C ᄝ૫֥၂ᅣđ໡ૌษંਔೂޅ൐Ⴈ C ݦඔঔᅚ Lua ֥ۿିđགྷᄝ໡ૌษંೂޅ൐Ⴈ C ᇏྍԷࡹ֥ো྘টঔᅚ Luab໡ૌՖ၂۱ཬ২ሰष൓đЧᅣު࿃҆ٳࡼၛᆃ۱ཬ২ሰ ູࠎԤᇯ҄ࡆೆ metamethods ֩ః෰ଽಸটࢺകೂޅ൐Ⴈ C ᇏྍো྘ঔᅚ Luab ໡ૌ֥২ሰട֥ࠣো྘٤ӈࡥֆđ ඔሳඔቆb ᆃ۱২ሰ֥ଢ֥ᄝႿࡼଢܻࠢᇏ֞ API ໙ีഈđ෮ၛ҂ടࠣگᄖ֥ෘمb࣐ܵ২ሰᇏ֥ো྘ޓࡥֆđ֌ޓ؟ႋႨᇏ׻߶Ⴈ֞ᆃ ᇕো྘b၂Ϯ౦ঃ༯đLua ᇏѩ҂ླေຓ֥҆ඔቆđၹູݗ༐іޓݺ֥ൌགྷਔඔቆb֌ ൞ؓႿ٤ӈն֥ඔቆط࿽đݗ༐іॖି֝ᇁଽթ҂ቀđၹູؓႿૄ၂۱ჭ෍сྶЌթ၂ ۱ٓྟ֥čgenericĎᆴđ၂۱৽ࢤֹᆶđࡆഈ၂ུၛСࡼটᄹӉ֥حຓॢࡗbᄝ C ᇏ֥ ᆰࢤթԥඔሳᆴ҂ླေحຓ֥ॢࡗđࡼбݗ༐і֥ൌགྷٚൔࢫസ 50%֥ଽթॢࡗb ໡ૌ൐Ⴈ༯૫֥ࢲܒіൕ໡ૌ֥ඔቆğ typedef struct NumArray { int size; double values[1]; /* variable part */ } NumArray; ໡ૌ൐Ⴈնཬ 1 ലૼඔቆ֥ valuesđႮႿ C ე࿽҂ᄍྸնཬູ 0 ֥ඔቆđᆃ۱ 1 ᆺ ൞၂۱ᅝ໊ژĠ໡ૌᄝު૫קၬඔቆٳ஥ॢࡗ֥ൌ࠽նཬbؓႿ၂۱Ⴕ n ۱ჭ෍֥ඔቆ টඪđ໡ૌླေ sizeof(NumArray) + (n-1)*sizeof(double) bytes čႮႿჰ൓֥ࢲܒᇏၘࣜЇݣਔ၂۱ჭ෍֥ॢࡗđ෮ၛ໡ૌՖ n ᇏࡨಀ 1Ď 2 28 8. .1 1 U Us se er rd da at ta a ໡ૌ൮༵ܱྏ֥൞ೂޅᄝ Lua ᇏіൕඔቆ֥ᆴbLua ູᆃᇕ౦ঃิ܂ህ૊ิ܂၂۱ ࠎЧ֥ো྘ğuserdatab၂۱ userdatum ิ܂ਔ၂۱ᄝ Lua ᇏીႵყקၬҠቔ֥ raw ଽթ ౵თb Lua API ิ܂ਔ༯૫֥ݦඔႨটԷࡹ၂۱ userdatumğ void *lua_newuserdata (lua_State *L, size_t size); lua_newuserdata ݦඔοᅶᆷק֥նཬٳ஥၂ॶଽթđࡼؓႋ֥ userdatum ٢֞ᅜଽđ ѩْ߭ଽթॶֹ֥ᆶbೂݔԛႿଖུჰၹ୆ླေ๙ݖః෰֥ٚمٳ஥ଽթ֥߅đޓಸၞ Էࡹ၂۱ᆷᆌնཬ֥ userdatumđಖުࡼᆷཟൌ࠽ଽթॶ֥ᆷᆌЌթ֞ userdatum ৚b໡ ૌࡼᄝ༯၂ᅣु֞ᆃᇕ࠯ඌ֥২ሰb
  213. Programming in Lua 213 Copyright ® 2005, Translation Team, www.luachina.net

    ൐Ⴈ lua_newuserdata ݦඔđԷࡹྍඔቆ֥ݦඔൌགྷೂ༯ğ static int newarray (lua_State *L) { int n = luaL_checkint(L, 1); size_t nbytes = sizeof(NumArray) + (n - 1)*sizeof(double); NumArray *a = (NumArray *)lua_newuserdata(L, nbytes); a->size = n; return 1; /* new userdatum is already on the stack */ } čݦඔ luaL_checkint ൞Ⴈট࡟Ұᆜඔ֥ luaL_checknumber ֥эุĎ၂֊ newarray ᄝ Lua ᇏФᇿҨᆭުđ୆ࣼॖၛ൐Ⴈোර a = array.new(1000)֥ეओԷࡹ၂۱ྍ֥ඔቆ ਔb ູਔթԥჭ෍đ໡ૌ൐Ⴈোර array.set(array, index, value)טႨđު૫໡ૌࡼु֞ೂ ޅ൐Ⴈ metatables টᆦӻӈ֥ܿཿم array[index] = valuebؓႿᆃਆᇕཿمđ༯૫֥ݦඔ ൞၂ဢ֥đඔቆ༯ѓՖĖष൓ğ static int setarray (lua_State *L) { NumArray *a = (NumArray *)lua_touserdata(L, 1); int index = luaL_checkint(L, 2); double value = luaL_checknumber(L, 3); luaL_argcheck(L, a != NULL, 1, "`array' expected"); luaL_argcheck(L, 1 <= index && index <= a->size, 2, "index out of range"); a->values[index-1] = value; return 0; } luaL_argcheck ݦඔ࡟Ұ۳ק่֥ࡱđೂݔႵсေ֥߅஘ԛհ༂bၹՎđೂݔ໡ૌ൐ Ⴈհ༂֥ҕඔטႨ setarrayđ໡ૌࡼ֤֞၂۱հ༂ྐ༏ğ array.set(a, 11, 0) --> stdin:1: bad argument #1 to 'set' ('array' expected) ༯૫֥ݦඔࠆ౼၂۱ඔቆჭ෍ğ static int getarray (lua_State *L) { NumArray *a = (NumArray *)lua_touserdata(L, 1); int index = luaL_checkint(L, 2);
  214. Programming in Lua 214 Copyright ® 2005, Translation Team, www.luachina.net

    luaL_argcheck(L, a != NULL, 1, "'array' expected"); luaL_argcheck(L, 1 <= index && index <= a->size, 2, "index out of range"); lua_pushnumber(L, a->values[index-1]); return 1; } ໡ૌקၬਸ਼၂۱ݦඔটࠆ౼ඔቆ֥նཬğ static int getsize (lua_State *L) { NumArray *a = (NumArray *)lua_touserdata(L, 1); luaL_argcheck(L, a != NULL, 1, "`array' expected"); lua_pushnumber(L, a->size); return 1; } ቋުđ໡ૌླေ၂ུحຓ֥ս઒টԚ൓߄໡ૌ֥९ğ static const struct luaL_reg arraylib [] = { {"new", newarray}, {"set", setarray}, {"get", getarray}, {"size", getsize}, {NULL, NULL} }; int luaopen_array (lua_State *L) { luaL_openlib(L, "array", arraylib, 0); return 1; } ᆃظ໡ૌᄜՑ൐Ⴈਔڣᇹ९֥ luaL_openlib ݦඔđ෰۴ऌ۳ק֥଀ሳԷࡹ၂۱іđ ѩ൐Ⴈ arraylib ඔቆᇏ֥ name-function ؓแԉᆃ۱іb յषഈ૫קၬ֥९ᆭުđ໡ૌࣼॖၛᄝ Lua ᇏ൐Ⴈ໡ૌྍקၬ֥ো྘ਔğ a = array.new(1000) print(a) --> userdata: 0x8064d48 print(array.size(a)) --> 1000 for i=1,1000 do array.set(a, i, 1/i) end
  215. Programming in Lua 215 Copyright ® 2005, Translation Team, www.luachina.net

    print(array.get(a, 10)) --> 0.1 ᄝ၂۱ Pentium/Linux ߌ࣢ᇏᄎྛᆃ۱ӱ྽đ၂۱Ⴕ 100K ჭ෍֥ඔቆնۀᅝႨ 800KB ֥ଽթđ๝ဢ่֥ࡱႮ Lua іൌགྷ֥ඔቆླေ 1.5MB ֥ଽթb 2 28 8. .2 2 M Me et ta at ta ab bl le es s ໡ૌഈ૫֥ൌགྷႵ၂۱ޓն֥νಆ੐׳bࡌೂ൐Ⴈᆀཿਔೂ༯োර֥ս઒ğ array.set(io.stdin, 1, 0)bio.stdin ᇏ֥ᆴ൞၂۱ջႵᆷཟੀ(FILE*)֥ᆷᆌ֥ userdatumbၹ ູ෱൞၂۱ userdatumđ෮ၛ array.set ޓুၩࢤ൳෱ቔູҕඔđӱ྽ᄎྛ֥ࢲݔॖି֝ᇁ ଽթ core dumpčೂݔ୆ܔྜྷᄎ֥߅đ୆ॖି֤֞၂۱٠໙ᄀࢸčindex-out-of-rangeĎհ ༂Ď bᆃဢ֥հ༂ؓႿ಩ޅ၂۱ Lua ९টඪ׻൞҂ିಧ൳֥b҂ં୆ೂޅ൐Ⴈ၂۱ C ९đ ׻҂ႋھ௥ߊ C ඔऌࠇᆀՖ Lua Ӂള core dumpb ູਔ౵ٳඔቆބః෰֥ userdatađ ໡ૌֆ׿ູඔቆԷࡹਔ၂۱ metatable č࠺ᇾ userdata ္ॖၛႚႵ metatablesĎ b༯૫đ໡ૌૄՑԷࡹ၂۱ྍ֥ඔቆ֥ൈީđ໡ૌࡼᆃ۱ֆ׿֥ metatable ѓ࠺ູඔቆ֥ metatablebૄՑ໡ૌ٠໙ඔቆ֥ൈީđ໡ૌ׻ေ࡟Ұ෰൞ڎႵ၂ ۱ᆞಒ֥ metatablebၹູ Lua ս઒҂ିڿэ userdatum ֥ metatableđ෮ၛ෰҂߶ເᄯ໡ ૌ֥ս઒b ໡ૌߎླေ၂۱ֹٚটЌթᆃ۱ྍ֥ metatableđᆃဢ໡ૌҌିܔ֒Էࡹྍඔቆބ࡟ Ұ၂۱۳ק֥ userdatum ൞ڎ൞၂۱ඔቆ֥ൈީđॖၛ٠໙ᆃ۱ metatablebᆞೂ໡ૌభ ૫ࢺകݖ֥đႵਆᇕٚمॖၛЌթ metatableğᄝ registry ᇏđࠇᆀᄝ९ᇏቔູݦඔ֥ upvaluebᄝ Lua ᇏ၂Ϯ༝ܸႿᄝ registry ᇏᇿҨྍ֥ C ো྘đ൐Ⴈো྘଀ቔູ෬ႄđ metatable ቔູᆴbބః෰֥ registry ᇏ֥෬ႄ၂ဢđ໡ૌсྶ࿊ᄴ၂۱ື၂֥ো྘଀đ х૧Ԋ๬b໡ૌࡼᆃ۱ྍ֥ো྘ӫູ "LuaBook.array"b ڣᇹ९ิ܂ਔ၂ུݦඔটϺᇹ໡ૌࢳथ໙ีđ໡ૌᆃظࡼႨ֥֞భ૫ໃิ֥֞ڣᇹ ݦඔႵğ int luaL_newmetatable (lua_State *L, const char *tname); void luaL_getmetatable (lua_State *L, const char *tname); void *luaL_checkudata (lua_State *L, int index, const char *tname); luaL_newmetatable ݦඔԷࡹ၂۱ྍіčࡼႨቔ metatableĎ đࡼྍі٢֞ᅜפѩࡹ৫ іބ registry ᇏো྘଀֥৳༢bᆃ۱ܱ৳൞චཟ֥ğ൐Ⴈো྘଀ቔູі֥ keyĠ๝ൈ൐Ⴈ іቔູো྘଀֥ keyčᆃᇕචཟ֥ܱ৳đ൐֤ః෰֥ਆ۱ݦඔ֥ൌགྷིੱ۷ۚĎ b luaL_getmetatable ݦඔࠆ౼ registry ᇏ֥ tname ؓႋ֥ metatablebቋުđluaL_checkudata ࡟Ұᄝᅜᇏᆷק໊ᇂ֥ؓའ൞ڎູջႵ۳ק଀ሳ֥ metatable ֥ usertatumbೂݔؓའ҂ թᄝᆞಒ֥ metatableđْ߭ NULLčࠇᆀ෱҂൞၂۱ userdataĎ Ġڎᄵđْ߭ userdata ֥ ֹᆶb ༯૫টुऎุ֥ൌགྷbֻ၂҄ྩڿյष९֥ݦඔđྍϱЧсྶԷࡹ၂۱Ⴈቔඔቆ
  216. Programming in Lua 216 Copyright ® 2005, Translation Team, www.luachina.net

    metatable ֥іğ int luaopen_array (lua_State *L) { luaL_newmetatable(L, "LuaBook.array"); luaL_openlib(L, "array", arraylib, 0); return 1; } ֻؽ҄đྩڿ newarrayđ൐֤ᄝԷࡹඔቆ֥ൈީഡᇂඔቆ֥ metatableğ static int newarray (lua_State *L) { int n = luaL_checkint(L, 1); size_t nbytes = sizeof(NumArray) + (n - 1)*sizeof(double); NumArray *a = (NumArray *)lua_newuserdata(L, nbytes); luaL_getmetatable(L, "LuaBook.array"); lua_setmetatable(L, -2); a->size = n; return 1; /* new userdatum is already on the stack */ } lua_setmetatable ݦඔࡼіԛᅜđѩࡼఃഡᇂູ۳ק໊ᇂ֥ؓའ֥ metatablebᄝ໡ૌ ֥২ሰᇏđᆃ۱ؓའࣼ൞ྍ֥ userdatumb ቋު၂҄đsetarrayagetarray ބ getsize ࡟Ұ෰ૌֻ֥၂۱ҕඔ൞ڎ൞၂۱Ⴕི֥ඔ ቆb ၹູ໡ૌյෘᄝҕඔհ༂֥౦ঃ༯஘ԛ၂۱հ༂ྐ༏đ ໡ૌקၬਔ༯૫֥ڣᇹݦඔğ static NumArray *checkarray (lua_State *L) { void *ud = luaL_checkudata(L, 1, "LuaBook.array"); luaL_argcheck(L, ud != NULL, 1, "`array' expected"); return (NumArray *)ud; } ൐Ⴈ checkarrayđྍקၬ֥ getsize ൞۷ᆰܴa۷ౢԣğ static int getsize (lua_State *L) { NumArray *a = checkarray(L); lua_pushnumber(L, a->size); return 1; } ႮႿ setarray ބ getarray ࡟Ұֻؽ۱ҕඔ index ֥ս઒ཌྷ๝đ໡ૌԎའԛ෰ૌ֥܋๝ ҆ٳđᄝ၂۱ֆ׿֥ݦඔᇏປӮğ static double *getelem (lua_State *L) {
  217. Programming in Lua 217 Copyright ® 2005, Translation Team, www.luachina.net

    NumArray *a = checkarray(L); int index = luaL_checkint(L, 2); luaL_argcheck(L, 1 <= index && index <= a->size, 2, "index out of range"); /* return element address */ return &a->values[index - 1]; } ൐Ⴈᆃ۱ getelemđݦඔ setarray ބ getarray ۷ࡆᆰܴၞ׭ğ static int setarray (lua_State *L) { double newvalue = luaL_checknumber(L, 3); *getelem(L) = newvalue; return 0; } static int getarray (lua_State *L) { lua_pushnumber(L, *getelem(L)); return 1; } གྷᄝđࡌೂ୆Ӈ൫োර array.get(io.stdin, 10)֥ս઒đ୆ࡼ߶֤֞ᆞಒ֥հ༂ྐ༏ğ error: bad argument #1 to 'getarray' ('array' expected) 2 28 8. .3 3 ٠ ٠໙ ໙૫ ૫ཟ ཟؓ ؓའ འ֥ ֥ඔ ඔऌ ऌ ༯૫໡ૌটुुೂޅקၬো྘ູؓའ֥ userdatađၛᇁ໡ૌࣼॖၛ൐Ⴈ૫ཟؓའ֥ ეمটҠቔؓའ֥ൌ২đбೂğ a = array.new(1000) print(a:size()) --> 1000 a:set(10, 3.4) print(a:get(10)) --> 3.4 ࠺ᇾ a:size()֩ࡎႿ a.size(a)b෮ၛđ໡ૌсྶ൐֤іղൔ a.size טႨ໡ૌ֥ getsize ݦඔbᆃظ֥ܱ࡯ᄝႿ__index ჭٚمčmetamethodĎ֥൐ႨbؓႿіটඪđ҂ܵ൉હ ൈީᆺေᅳ҂֞۳ק֥ keyđᆃ۱ჭٚمࣼ߶ФטႨbؓႿ userdata টࢃđૄՑФ٠໙ ֥ൈީჭٚم׻߶ФטႨđၹູ userdata ۴ЧࣼીႵ಩ޅ keyb ࡌೂ໡ૌᄎྛ༯૫֥ս઒ğ
  218. Programming in Lua 218 Copyright ® 2005, Translation Team, www.luachina.net

    local metaarray = getmetatable(array.new(1)) metaarray.__index = metaarray metaarray.set = array.set metaarray.get = array.get metaarray.size = array.size ֻ၂ྛđ ໡ૌࣇࣇԷࡹ၂۱ඔቆѩࠆ౼෰֥ metatableđ metatable Фڮᆴ۳ metaarray č໡ૌ҂ିՖ Lua ᇏഡᇂ userdata ֥ metatableđ֌൞໡ૌᄝ Lua ᇏ໭ཋᇅ֥٠໙ metatableĎ b ࢤ༯টđ ໡ૌഡᇂ metaarray.__index ູ metaarrayb ֒໡ૌ࠹ෘ a.size ֥ൈީđ Lua ᄝؓའ a ᇏᅳ҂֞ size ᆃ۱࡯ᆴđၹູؓའ൞၂۱ userdatumb෮ၛđLua ൫ሢՖؓ འa ֥metatable֥__indexთࠆ౼ᆃ۱ᆴđ ᆞݺ__indexࣼ൞metaarrayb ֌൞metaarray.size ࣼ൞ array.size,ၹՎ a.size(a)ೂ໡ૌყ௹ْ֥߭ array.size(a)b ֒ಖđ໡ૌॖၛᄝ C ᇏປӮ๝ဢ֥൙౦đമᇀॖၛቓ֤۷ݺğགྷᄝඔቆ൞ؓའđ෰ Ⴕሱ֥࠭Ҡቔđ໡ૌᄝіඔቆᇏ҂ླေᆃུҠቔb໡ૌൌགྷ֥९ື၂ླေؓຓิ܂֥ݦ ඔࣼ൞ newđႨটԷࡹ၂۱ྍ֥ඔቆb෮Ⴕః෰֥ҠቔቔູٚمൌགྷbC ս઒ॖၛᆰࢤ ᇿҨ෰ૌb getsizeagetarray ބ setarray ა໡ૌభ૫֥ൌགྷ၂ဢđ҂ླေڿэb໡ૌླေڿэ֥ ᆺ൞ೂޅᇿҨ෰ૌb္ࣼ൞ඪđ໡ૌсྶڿэյष९֥ݦඔb൮༵đ໡ૌླေٳ৖ݦඔ ਙіđ၂۱ቔູ௴๙ݦඔđ၂۱ቔູٚمğ static const struct luaL_reg arraylib_f [] = { {"new", newarray}, {NULL, NULL} }; static const struct luaL_reg arraylib_m [] = { {"set", setarray}, {"get", getarray}, {"size", getsize}, {NULL, NULL} }; ྍϱЧյष९֥ݦඔ luaopen_arrayđсྶԷࡹ၂۱ metatableđѩࡼఃڮᆴ۳ሱ֥࠭ __index თđᄝପظᇿҨ෮Ⴕ֥ٚمđԷࡹѩแԉඔቆіğ int luaopen_array (lua_State *L) { luaL_newmetatable(L, "LuaBook.array"); lua_pushstring(L, "__index"); lua_pushvalue(L, -2); /* pushes the metatable */ lua_settable(L, -3); /* metatable.__index = metatable */
  219. Programming in Lua 219 Copyright ® 2005, Translation Team, www.luachina.net

    luaL_openlib(L, NULL, arraylib_m, 0); luaL_openlib(L, "array", arraylib_f, 0); return 1; } ᆃ৚໡ૌ൐Ⴈਔ luaL_openlib ֥ਸ਼၂۱หᆘđֻ၂ՑטႨđ֒໡ૌԮ־၂۱ NULL ቔູ९଀ൈđluaL_openlib ѩીႵԷࡹ಩ޅЇݣݦඔ֥іĠཌྷّđ෰ಪູٿልݦඔ֥і ᄝᅜଽđ໊Ⴟਢൈ֥ upvalues ֥༯૫bᄝᆃ۱২ሰᇏđٿልݦඔ֥і൞ metatable Чദđ ္ࣼ൞ luaL_openlib ٢ᇂٚمֹ֥ٚbֻؽՑטႨ luaL_openlib ᆞӈ۽ቔğ۴ऌ۳ק֥ ඔቆ଀Էࡹ၂۱ྍіđѩᄝіᇏᇿҨᆷק֥ݦඔč২ሰᇏᆺႵ၂۱ݦඔ newĎ b ༯૫֥ս઒đ໡ૌູ໡ૌ֥ྍো྘เࡆ၂۱__tostring ٚمđᆃဢ၂ট print(a)ࡼյ ႆඔቆࡆഈඔቆ֥նཬđնཬਆшջႵჵওݼčбೂđarray(1000)Ď ğ int array2string (lua_State *L) { NumArray *a = checkarray(L); lua_pushfstring(L, "array(%d)", a->size); return 1; } ݦඔ lua_pushfstring ۬ൔ߄ሳژԱđѩࡼః٢֞ᅜפbູਔᄝඔቆؓའ֥ metatable ᇏЇݣ array2stringđ໡ૌߎсྶᄝ arraylib_m ਙіᇏเࡆ array2stringğ static const struct luaL_reg arraylib_m [] = { {"__tostring", array2string}, {"set", setarray}, ... }; 2 28 8. .4 4 ٠ ٠໙ ໙ඔ ඔቆ ቆ Ԣਔഈ૫ࢺക֥൐Ⴈ૫ཟؓའ֥ཿمট٠໙ඔቆၛຓđߎॖၛ൐ႨԮ๤֥ཿمট٠ ໙ඔቆჭ෍đ҂൞ a:get(i)đط൞ a[i]bؓႿ໡ૌഈ૫֥২ሰđޓಸၞൌགྷᆃ۱đၹູ໡ ૌ֥ setarray ބ getarray ݦඔၘࣜ၇Ցࢤ൳ਔა෰ૌ֥ჭٚمؓႋ֥ҕඔb ၂۱ॹ෎֥ࢳ थٚم൞ᄝ໡ૌ֥ Lua ս઒ᇏᆞಒ֥קၬᆃུჭٚمğ local metaarray = getmetatable(newarray(1)) metaarray.__index = array.get metaarray.__newindex = array.set čᆃ؍ս઒сྶᄎྛᄝభ૫֥ቋԚ֥ඔቆൌགྷࠎԤഈđ҂ି൐Ⴈູਔ૫ཟؓའ٠໙
  220. Programming in Lua 220 Copyright ® 2005, Translation Team, www.luachina.net

    ֥ྩڿ֥ପ؍ս઒Ď ໡ૌေቓ֥ᆺ൞൐ႨԮ๤֥ეمğ a = array.new(1000) a[10] = 3.4 -- setarray print(a[10]) -- getarray --> 3.4 ೂݔ໡ૌ༟ߋ֥߅đ໡ૌॖၛᄝ໡ૌ֥ C ս઒ᇏᇿҨᆃུჭٚمb໡ૌᆺླေྩڿ ໡ૌ֥Ԛ൓߄ݦඔğ int luaopen_array (lua_State *L) { luaL_newmetatable(L, "LuaBook.array"); luaL_openlib(L, "array", arraylib, 0); /* now the stack has the metatable at index 1 and 'array' at index 2 */ lua_pushstring(L, "__index"); lua_pushstring(L, "get"); lua_gettable(L, 2); /* get array.get */ lua_settable(L, 1); /* metatable.__index = array.get */ lua_pushstring(L, "__newindex"); lua_pushstring(L, "set"); lua_gettable(L, 2); /* get array.set */ lua_settable(L, 1); /* metatable.__newindex = array.set */ return 0; } 2 28 8. .5 5 L Li ig gh ht t U Us se er rd da at ta a ֞ଢభູᆸ໡ૌ൐Ⴈ֥ userdata ӫູ full userdatab Lua ߎิ܂ਔਸ਼၂ᇕ userdata: light userdatab ၂۱ light userdatum ൞၂۱іൕ C ᆷᆌ֥ᆴč္ࣼ൞၂۱ void *ো྘֥ᆴĎ bႮႿ෱ ൞၂۱ᆴđ໡ૌ҂ିԷࡹ෰ૌč๝ဢ֥đ໡ૌ္҂ିԷࡹ၂۱ඔሳĎ bॖၛ൐Ⴈݦඔ lua_pushlightuserdata ࡼ၂۱ light userdatum ೆᅜğ void lua_pushlightuserdata (lua_State *L, void *p); ࣐ܵ׻൞ userdatađlight userdata ބ full userdata Ⴕޓն҂๝bLight userdata ҂൞၂ ۱ߏԊ౵đࣇࣇ൞၂۱ᆷᆌđીႵ metatablesbཞඔሳ၂ဢđlight userdata ҂ླေগࠍ൬
  221. Programming in Lua 221 Copyright ® 2005, Translation Team, www.luachina.net

    ࠢఖটܵ৘ෲb ႵུದϜ light userdata ቔູ၂۱֮սࡎู֥սൌགྷđটսู full userdatađ֌൞ᆃ҂ ൞ light userdata ֥ׅ྘ႋႨb൮༵đ൐Ⴈ light userdata ୆сྶሱ࠭ܵ৘ଽթđၹູ෰ૌ ބগࠍ൬ࠢఖ໭ܱbֻؽđ࣐ܵՖ଀ሳഈुႵ౞ᇗᆭٳđ֌ full userdata ൌགྷ֥սࡎ္ѩ ҂նđбࢠط࿽đ෰ᆺ൞ᄝٳ஥۳קնཬ֥ଽթൈީđႵ၂ׄׄحຓ֥սࡎb Light userdata ᆇᆞ֥ႨԩᄝႿॖၛіൕ҂๝ো྘֥ؓའb ֒ full userdata ൞၂۱ؓའ ֥ൈީđ෱֩ႿؓའሱദĠਸ਼၂ٚ૫đlight userdata іൕ֥൞၂۱ᆷཟؓའ֥ᆷᆌđ๝ ဢ֥đ෱֩Ⴟᆷᆌᆷཟ֥಩ޅো྘֥ userdatab෮ၛđ໡ૌᄝ Lua ᇏ൐Ⴈ light userdata іൕ C ؓའb ु၂۱ׅ྘֥২ሰđࡌק໡ૌေൌགྷğLua ބԳ१༢๤֥Ͼקbᆃᇕ౦ঃ༯đ໡ૌ ൐Ⴈ full userdata іൕԳ१čૄ၂۱ userdatum ॖၛЇݣᆜ۱Գ१ࢲܒࠇᆀ၂۱Ⴕ༢๤Է ࡹ֥ᆷཟֆ۱Գ१֥ᆷᆌĎ b֒ᄝԳ१Ⴕ၂۱൙ࡱؿളčбೂο༯ඊѓĎ đ༢๤߶۴ऌԳ १ֹ֥ᆶטႨህ૊֥߭טݦඔbູਔࡼᆃ۱߭טݦඔԮ־۳ Luađ໡ૌсྶᅳ֞іൕᆷ קԳ१֥ userdatab ູਔᅳ֞ᆃ۱ userdata,໡ૌॖၛ൐Ⴈ၂۱іğ ෬ႄູіൕԳ१ֹᆶ֥ light userdatađᆴູᄝ Lua ᇏіൕԳ१֥ full userdatab၂֊໡ૌႵਔԳ१ֹ֥ᆶđ໡ૌ ࡼԳ१ֹᆶቔູ light userdata ٢֞ᅜଽđѩ౏ࡼ userdata ቔູі֥෬ႄթ֞іଽb čᇿၩ ᆃ۱іႋھႵ၂۱ weak ᆴđڎᄵđᆃུ full userdata Ⴅჹ҂߶Ф߭൬וb Ď
  222. Programming in Lua 222 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ 29 ᅣ ሧჷܵ৘ ᄝభ૫၂ᅣࢺക֥ඔቆൌགྷٚمđ໡ૌ҂сքྏೂޅܵ৘ሧჷđᆺླေٳ஥ଽթb ૄ၂۱іൕඔቆ֥ userdatum ׻Ⴕሱ֥࠭ଽթđᆃ۱ଽթႮ Lua ܵ৘b֒ඔቆэູগࠍ č္ࣼ൞ඪđ֒ӱ྽҂ླေĎ֥ൈީđLua ߶ሱ׮൬ࠢѩ൤٢ଽթb ളࠃሹ൞҂ପહೂၩbႵൈީđ၂۱ؓའԢਔླေ໾৘ଽթၛຓđߎླေ໓ࡱ૭ඍ ژaԳ१ओѣ֩োර֥ሧჷb č๙ӈᆃུሧჷ္൞ଽթđ֌Ⴎ༢๤֥ః෰҆ٳটܵ৘Ď b ᄝᆃᇕ౦ঃ༯đ֒၂۱ؓའӮູগࠍѩФ൬֥ࠢൈީđᆃུཌྷܱ֥ሧჷ္ႋھФ൤٢b ၂ུ૫ཟؓའ֥ე࿽ູਔᆃᇕླေิ܂ਔ၂ᇕห൹֥ࠏᇅčӫູ finalizer ࠇᆀ༅ܒఖĎ b Lua ၛ__gc ჭٚم֥ٚൔิ܂ਔ finalizersbᆃ۱ჭٚمᆺؓ userdata ো྘֥ᆴႵིb֒ ၂۱ userdatum ࡼФ൬֥ࠢൈީđѩ౏ usedatum Ⴕ၂۱__gc თđLua ߶טႨᆃ۱თ֥ᆴ čႋھ൞၂۱ݦඔĎ ğၛ userdatum ቔູᆃ۱ݦඔ֥ҕඔטႨbᆃ۱ݦඔڵᄳ൤٢ა userdatum ཌྷܱ֥෮Ⴕሧჷb ູਔӂૼೂޅࡼᆃ۱ჭٚمބ API ቔູ၂۱ᆜุ൐Ⴈđᆃ၂ᅣ໡ૌࡼ൐Ⴈ Lua ঔᅚ ႋႨ֥ٚൔđࢺകਆ۱২ሰbֻ၂۱২ሰ൞భ૫ၘࣜࢺക֥ђ৥၂۱ଢ੣֥ݦඔ֥ਸ਼၂ ᇕൌགྷbֻؽ۱২ሰ൞၂۱Ͼק ExpatčExpat षჷ֥ XML ࢳ༅ఖĎൌགྷ֥ XML ࢳ༅ ఖb 2 29 9. .1 1 ଢ ଢ੣ ੣ם םս սఖ ఖ భ૫໡ૌൌགྷਔ၂۱ dir ݦඔđ۳ק၂۱ଢ੣ቔູҕඔđᆃ۱ݦඔၛ၂۱ table ֥ٚ ൔْ߭ଢ੣༯෮Ⴕ໓ࡱb໡ૌྍϱЧ֥ dir ݦඔࡼْ߭၂۱םսሰđૄՑטႨᆃ۱םս ሰ֥ൈީ߶ْ߭ଢ੣ᇏ֥၂۱ೆ१čentryĎ bοྍϱЧ֥ൌགྷٚൔđ໡ૌॖၛ൐Ⴈ࿖ߌ টђ৥ᆜ۱ଢ੣ğ for fname in dir(".") do print(fname) end ᄝ C ე࿽ᇏđ໡ૌླေ DIR ᆃᇕࢲܒҌିܔםս၂۱ଢ੣b๙ݖ opendir ҌିԷࡹ ၂۱ DIR ֥ൌ২đ ѩ౏сྶཁൔ֥טႨ closedir ট൤٢ሧჷb ໡ૌၛభൌགྷ֥ dir Ⴈ၂۱ ЧֹэਈЌթ DIR ֥ൌ২đѩ౏ᄝࠆ౼ଢ੣ᇏቋު၂۱໓ࡱ଀ᆭުܱоൌ২b֌໡ૌྍ ൌགྷ֥ dir ᇏ҂ିᄝЧֹэਈᇏЌթ DIR ֥ൌ২đၹູႵޓ؟۱טႨ׻ေ٠໙ᆃ۱ᆴđ ਸ਼ຓđ္҂ିࣇࣇᄝࠆ౼ଢ੣ᇏቋު၂۱໓ࡱ଀ᆭުܱоଢ੣bೂݔӱ྽࿖ߌݖӱᇏᇏ ؎๼ԛđםսሰ۴Чࣼ҂߶౼֤ቋު၂۱໓ࡱ଀đ෮ၛđູਔЌᆣ DIR ֥ൌ২၂קିܔ Ф൤٢וđ໡ૌࡼ෱ֹ֥ᆶЌթᄝ၂۱ userdatum ᇏđѩ൐Ⴈᆃ۱ userdatum ֥__gc ֥ ჭٚمট൤٢ଢ੣ࢲܒb ࣐ܵ໡ૌൌགྷᇏuserdatum֥ቔႨޓᇗေđ֌ᆃ۱Ⴈটіൕ၂۱ଢ੣֥userdatumđѩ
  223. Programming in Lua 223 Copyright ® 2005, Translation Team, www.luachina.net

    ҂ླေᄝLuaॖ࡮ٓຶᆭଽb Dirݦඔْ߭၂۱םսሰݦඔđ םսሰݦඔླေᄝLua֥ॖ࡮ ٓຶᆭଽbଢ੣ॖି൞םսሰݦඔ֥၂۱upvaluebᆃဢ၂টđםսሰݦඔࣼॖၛᆰࢤ٠ ໙ᆃ۱ࢲܒ7đ֌൞Lua҂ॖၛč္҂ླေĎ٠໙ᆃ۱ࢲܒb ሹ֥টඪđ໡ૌླေ೘۱ C ݦඔbֻ၂đdir ݦඔđ၂۱ Lua טႨ෰Ӂളםսఖ֥ ۽ӌđᆃ۱ݦඔсྶյष DIR ࢲܒѩࡼ෰ቔູםսݦඔ֥ upvaluebֻؽđ໡ૌླေ၂ ۱םսݦඔbֻ೘đ__gc ჭٚمđڵᄳܱо DIR ࢲܒb၂Ϯটඪđ໡ૌߎླေ၂۱حຓ ֥ݦඔটࣉྛ၂ུԚ൓֥Ҡቔđбೂູଢ੣Էࡹ metatableđѩԚ൓߄ᆃ۱ metatableb ൮༵ु໡ૌ֥ dir ݦඔğ #include <dirent.h> #include <errno.h> /* forward declaration for the iterator function */ static int dir_iter (lua_State *L); static int l_dir (lua_State *L) { const char *path = luaL_checkstring(L, 1); /* create a userdatum to store a DIR address */ DIR **d = (DIR **)lua_newuserdata(L, sizeof(DIR *)); /* set its metatable */ luaL_getmetatable(L, "LuaBook.dir"); lua_setmetatable(L, -2); /* try to open the given directory */ *d = opendir(path); if (*d == NULL) /* error opening the directory? */ luaL_error(L, "cannot open %s: %s", path, strerror(errno)); /* creates and returns the iterator function (its sole upvalue, the directory userdatum, is already on the stack top */ lua_pushcclosure(L, dir_iter, 1); return 1; } 7 ၲᇿğᆷଢ੣ࢲܒđࠧuserdatum
  224. Programming in Lua 224 Copyright ® 2005, Translation Team, www.luachina.net

    ᆃظႵ၂ׄླေᇿၩ֥đ ໡ૌсྶᄝյषଢ੣ᆭభԷࡹ userdatumb ೂݔ໡ૌ༵յष ଢ੣đಖުטႨ lua_newuserdata ߶஘ԛհ༂đᆃဢ໡ૌࣼ໭مࠆ౼ DIR ࢲܒbοᅶᆞಒ ֥ඨ྽đDIR ࢲܒ၂֊ФԷࡹđࣼ߶৫ख़ބ userdatum ܱ৳ఏটĠᆭު҂ܵؿള൉હđ __gc ჭٚم׻߶ሱ׮֥൤٢ᆃ۱ࢲܒb ֻؽ۱ݦඔ൞םսఖğ static int dir_iter (lua_State *L) { DIR *d = *(DIR **)lua_touserdata(L, lua_upvalueindex(1)); struct dirent *entry; if ((entry = readdir(d)) != NULL) { lua_pushstring(L, entry->d_name); return 1; } else return 0; /* no more values to return */ } __gc ჭٚمႨটܱоଢ੣đ֌Ⴕ၂ׄླေཬྏğၹູ໡ૌᄝյषଢ੣ᆭభԷࡹ userdatumđ෮ၛ҂ܵ opendir ֥ࢲݔ൞൉હđuserdatum ࡼট׻߶Ф൬ࠢbೂݔ opendir ാϧđࡼটࣼીႵ൉હॖၛܱо֥ਔğ static int dir_gc (lua_State *L) { DIR *d = *(DIR **)lua_touserdata(L, 1); if (d) closedir(d); return 0; } ቋު၂۱ݦඔյषᆃ۱ᆺႵ၂۱ݦඔ֥९ğ int luaopen_dir (lua_State *L) { luaL_newmetatable(L, "LuaBook.dir"); /* set its __gc field */ lua_pushstring(L, "__gc"); lua_pushcfunction(L, dir_gc); lua_settable(L, -3); /* register the `dir' function */ lua_pushcfunction(L, l_dir); lua_setglobal(L, "dir"); return 0; }
  225. Programming in Lua 225 Copyright ® 2005, Translation Team, www.luachina.net

    ᆜ۱২ሰႵ၂۱ᇿၩׄbष൓֥ൈީđdir_gc ुఏটႋھ࡟Ұ෰֥ҕඔ൞ڎ൞၂۱ ଢ੣bڎᄵđ၂۱ذၩ֥൐ႨᆀॖିႨః෰ো྘֥ҕඔčбೂđ໓ࡱĎטႨᆃ۱ݦඔ֝ ᇁ࿸ᇗ֥ުݔbಖطđᄝ Lua ӱ྽ᇏ໭م٠໙ᆃ۱ݦඔğ෰Фթ٢ᄝଢ੣֥ metatable ᇏđLua ӱ྽Ֆট҂߶٠໙ᆃུଢ੣b 2 29 9. .2 2 X XM ML L ࢳ ࢳ༅ ༅ གྷᄝđ໡ૌࡼေु֞၂۱xmlࢳ༅ఖ֥ࡥֆൌགྷđӫູlxp8đ෱ЇওਔLuaބExpat čhttp://www.libexpat.org/Ď bExpat൞၂۱षჷ֥Cე࿽ཿӮ֥XML 1.0 ֥ࢳ༅ఖb෱ൌགྷ ਔSAXčhttp://www.saxproject.org/Ď đSAX൞XMLࡥֆ֥APIđ൞ࠎႿ൙ࡱ֥APIđᆃၩ ໅ሢ၂۱SAXࢳ༅ఖ؀౼Ⴕ၂۱XML໓֖đ ಖުّঌ۳ႋႨӱ྽෰෮ؿགྷ֥b ई۱২ሰđ ໡ૌေ๙ᆩExpatࢳ༅ᆃဢ၂۱ሳژԱğ <tag cap="5">hi</tag> ෱ࡼ߶Ӂള೘۱൙ࡱğ֒෱؀౼ሰሳژԱ "<tag cap="5">hi</tag>"đӁള၂۱؀౼ ֞ष൓ჭ෍֥൙ࡱĠ֒෱ࢳ༅ "hi" ൈđӁള၂۱؀౼໓Ч൙ࡱčႵൈ္ӫູሳژඔऌ ൙ࡱĎ Ġ֒ࢳ༅ "end" ൈđӁള၂۱؀౼ࢲඏჭ෍֥൙ࡱbطૄ۱൙ࡱđ׻߶טႨႋႨ ӱ྽ൡ֥֒ओѣb ᆃ৚໡ૌ҂߶ടࠣ֞ᆜ۱ Expat ९đ໡ૌᆺ߶ࠢᇏࣚ৯ܱᇿପུିܔӂૼބ Lua ཌྷ ޺ቔႨ֥ྍ࠯ඌ֥҆ٳb֒໡ૌൌགྷਔނྏۿିުđᄝഈ૫ࣉྛঔᅚࡼ߶э֤ޓಸၞb ෙಖ Expat ࢳ༅ XML ໓֖ൈ߶Ⴕޓ؟൙ࡱđ໡ૌࡼ߶ܱྏ֥ࣇࣇ൞ഈ૫২ሰิ֥֞೘ ۱൙ࡱčष൓ჭ෍đࢲඏჭ෍đ໓ЧඔऌĎ đ໡ૌླေטႨ֥ API ൞ Expat ᇙ؟ API ᇏ ޓഒ֥ࠫ۱b൮༵đ໡ૌླေԷࡹބ༅ܒ Expat ࢳ༅ఖ֥ݦඔğ #include <xmlparse.h> XML_Parser XML_ParserCreate (const char *encoding); void XML_ParserFree (XML_Parser p); ᆃ৚ݦඔҕඔ൞ॖ࿊֥Ġᄝ໡ૌ֥൐Ⴈᇏđ໡ૌᆰࢤ࿊Ⴈ NULL ቔູҕඔb֒໡ૌ Ⴕਔ၂۱ࢳ༅ఖ֥ൈީđ໡ૌсྶᇿҨ߭ט֥ओѣğ XML_SetElementHandler(XML_Parser p, XML_StartElementHandler start, XML_EndElementHandler end); XML_SetCharacterDataHandler(XML_Parser p, XML_CharacterDataHandler hndl); 8 ၲᇿğܙ࠹൞lua xml parser֥ࡥཿb
  226. Programming in Lua 226 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ၂۱ݦඔ֨࠺ਔष൓ჭ෍ބࢲඏჭ෍֥ओѣbֻؽ۱ݦඔ֨࠺ਔ໓Чඔऌčᄝ XML ეمᇏ֥ሳژඔऌĎ֥ओѣb෮Ⴕ߭ו֥ओѣ๙ݖֻ၂۱ҕඔࢤ൬Ⴈ޼ඔऌbष൓ ჭ෍֥ओѣ๝ဢࢤ൬֞ѓద֥଀ӫބ෱֥උྟቔູҕඔğ typedef void (*XML_StartElementHandler)(void *uData, const char *name, const char **atts); ᆃུඋྟটሱႿၛ '\0' ࢲඏ֥ሳژԱቆӮ֥ඔቆđᆃུሳژԱٳљؓႋਔ၂ؓၛඋ ྟ଀ބඋྟᆴቆӮ֥උྟbࢲඏჭ෍֥ओѣᆺႵ၂۱ҕඔđࣼ൞ѓద଀b typedef void (*XML_EndElementHandler)(void *uData, const char *name) ቋᇔđ၂۱໓ЧओѣࣇࣇၛሳژԱቔູحຓ֥ҕඔbھ໓ЧሳژԱ҂ି൞ၛ'\0'ࢲඏ ֥ሳژԱđط൞ཁൔᆷૼӉ؇֥ሳژԱğ typedef void (*XML_CharacterDataHandler)(void *uData, const char *s, int len); ໡ૌႨ༯૫֥ݦඔࡼᆃུ໓ЧԮ۳ Expatğ int XML_Parse (XML_Parser p, const char *s, int len, int isFinal); Expat ๙ݖӮۿטႨ XML_Parse ၂؍၂؍֥ࢳ༅෱ࢤ൬֥֞໓ЧbXML_Parse ቋު ၂۱ҕඔູ isFinalđ෰іൕᆃ҆ٳ൞҂൞ XML ໓֖֥ቋު၂۱҆ٳਔbླေᇿၩ֥൞ ҂൞ૄ؍໓Ч׻ླေ๙ݖ 0 টіൕࢲඏđ ໡ૌ္ॖၛ๙ݖཁൌ֥Ӊ؇ট஑קb XML_Parse ݦඔೂݔؿགྷࢳ༅հ༂ࣼ߶ْ߭၂۱ 0čexpat ္ิ܂ਔڣᇹ֥ݦඔটཁൕհ༂ྐ༏đ֌ ൞ၹູࡥֆ֥ჸܣđ໡ૌᆃ৚׻ࡼᆭޭ੻וĎ b໡ૌླေ Expat ֥ቋު၂۱ݦඔ൞ᄍྸ໡ ૌഡᇂࡼေԮ۳ओѣ֥Ⴈ޼ඔऌ֥ݦඔğ void XML_SetUserData (XML_Parser p, void *uData); ݺਔđགྷᄝ໡ૌটु၂༯ೂޅᄝ Lua ᇏ൐Ⴈ Expat ९bֻ၂ᇕٚم္൞ቋᆰࢤ֥၂ ᇕٚمğ ࡥֆ֥ᄝ Lua ᇏ֝ೆᆃུݦඔb бࢠݺ֥ٚم൞ؓ Lua טᆜᆃུݦඔb бೂ Lua ൞ીႵো྘֥đ໡ૌ҂ླေႨ҂๝֥ݦඔটഡᇂ҂๝֥טႨb֌൞໡ૌᄸહဢх૧၂ఏ טႨପུᇿҨਔ֥ݦඔ଻bูս֥൞đ֒໡ૌԷࡹਔ၂۱ࢳ༅ఖđ໡ૌ๝ൈ۳ԛਔ၂۱ Їݣ෮Ⴕ߭טओѣၛࠣཌྷႋ֥࡯ᆴ֥߭טіbई۱২ሰটඪđೂݔ໡ૌေյႆ၂۱໓֖ ֥҃अđ໡ૌॖၛႨ༯૫֥߭טіğ local count = 0 callbacks = {
  227. Programming in Lua 227 Copyright ® 2005, Translation Team, www.luachina.net

    StartElement = function (parser, tagname) io.write("+ ", string.rep(" ", count), tagname, "\n") count = count + 1 end, EndElement = function (parser, tagname) count = count - 1 io.write("- ", string.rep(" ", count), tagname, "\n") end, } ൻೆ"<to> <yes/> </to>"đᆃུओѣࡼ߶յႆԛğ + to + yes - yes - to ๙ݖᆃ۱ APIđ໡ૌ҂ླေົ޹ᆃུݦඔ֥טႨb໡ૌᆰࢤᄝ߭טіᇏົ߭෰ૌb ၹՎđᆜ۱ API ླေ೘۱ݦඔğ၂۱Էࡹࢳ༅ఖđ၂۱ࢳ༅၂؍؍໓Чđቋު၂۱ܱо ࢳ༅ఖb čൌ࠽ഈđ໡ૌႨࢳ༅ఖؓའ֥ٚمđൌགྷਔቋުਆ۱ۿିĎ bؓᆃུ API ݦඔ ֥ׅ྘൐Ⴈೂ༯ğ p = lxp.new(callbacks) -- create new parser for l in io.lines() do -- iterate over input lines assert(p:parse(l)) -- parse the line assert(p:parse("\n")) -- add a newline end assert(p:parse()) -- finish document p:close() གྷᄝđಞ໡ૌϜᇿၩ৯ࠢᇏ֞ൌགྷᇏটb൮༵đॉ੮ೂޅᄝ Lua ᇏൌགྷࢳ༅ఖbޓ ሱಖ֥߶མ֞൐Ⴈ userdatumđ֌൞໡ૌࡼ൉હଽಸ٢ᄝ userdata ৚଻Ĥᇀഒđ໡ૌсྶ Ќ਽ൌ࠽֥ Expat ࢳ༅ఖބ၂۱߭טіb ໡ૌ҂ିࡼ၂۱ Lua іЌթᄝ၂۱ userdatum čࠇ ᆀᄝ಩ޅ֥ C ࢲܒᇏĎ đಖطđ໡ૌॖၛԷࡹ၂۱ᆷཟі֥ႄႨđѩࡼᆃ۱ႄႨЌթᄝ userdatum ᇏb č໡ૌᄝ 27.3.2 ࢫၘࣜඪݖđ၂۱ႄႨࣼ൞ Lua ሱ׮Ӂള֥ᄝ registry ᇏ ֥၂۱ᆜඔĎቋުđ໡ૌߎсྶିܔࡼ Lua ֥ሑ෿Ќթ֞၂۱ࢳ༅ఖؓའᇏđၹູᆃུ ࢳ༅ఖؓའࣼ൞ Expat ߭טՖ໡ૌӱ྽ᇏࢤ൳֥෮Ⴕଽಸđѩ౏ᆃུ߭טླေטႨ Luab ၂۱ࢳ༅ఖ֥ؓའ֥קၬೂ༯ğ #include <xmlparse.h> typedef struct lxp_userdata {
  228. Programming in Lua 228 Copyright ® 2005, Translation Team, www.luachina.net

    lua_State *L; XML_Parser *parser; /* associated expat parser */ int tableref; /* table with callbacks for this parser */ } lxp_userdata; ༯૫൞Էࡹࢳ༅ఖؓའ֥ݦඔğ static int lxp_make_parser (lua_State *L) { XML_Parser p; lxp_userdata *xpu; /* (1) create a parser object */ xpu = (lxp_userdata *)lua_newuserdata(L, sizeof(lxp_userdata)); /* pre-initialize it, in case of errors */ xpu->tableref = LUA_REFNIL; xpu->parser = NULL; /* set its metatable */ luaL_getmetatable(L, "Expat"); lua_setmetatable(L, -2); /* (2) create the Expat parser */ p = xpu->parser = XML_ParserCreate(NULL); if (!p) luaL_error(L, "XML_ParserCreate failed"); /* (3) create and store reference to callback table */ luaL_checktype(L, 1, LUA_TTABLE); lua_pushvalue(L, 1); /* put table on the stack top */ xpu->tableref = luaL_ref(L, LUA_REGISTRYINDEX); /* (4) configure Expat parser */ XML_SetUserData(p, xpu); XML_SetElementHandler(p, f_StartElement, f_EndElement); XML_SetCharacterDataHandler(p, f_CharData); return 1; } ݦඔ lxp_make_parser Ⴕඹ۱ᇶေ҄ᇧğ
  229. Programming in Lua 229 Copyright ® 2005, Translation Team, www.luachina.net

    ֻ၂҄቎࿖܋๝֥ଆൔğ൮༵Էࡹ၂۱ userdatumđಖު൐Ⴈ consistent ֥ᆴყԚ൓ ߄ userdatumđቋުഡᇂ userdatum ֥ metatablebყԚ൓߄֥ჰၹᄝႿğೂݔᄝԚ൓߄֥ ൈީႵ಩ޅհ༂֥߅đ໡ૌсྶЌᆣ༅ܒఖč__gc ჭٚمĎିܔؿགྷᄝॖौሑ෿༯ؿགྷ userdata ѩ൤٢ሧჷb ֻؽ҄đݦඔԷࡹ၂۱ Expat ࢳ༅ఖđࡼ෱Ќթᄝ userdatum ᇏđѩ࡟ҩհ༂b ֻ೘҄đЌᆣݦඔֻ֥၂۱ҕඔ൞၂۱іč߭טіĎ đԷࡹ၂۱ᆷཟі֥ႄႨđѩࡼ ᆃ۱ႄႨЌթ֞ྍ֥ userdatum ᇏb ֻඹ҄đԚ൓߄ Expat ࢳ༅ఖđࡼ userdatum ഡᇂູࡼေԮ־۳߭טݦඔ֥ؓའđѩ ഡᇂᆃུ߭טݦඔbᇿၩđؓႿ෮Ⴕ֥ࢳ༅ఖটඪᆃུ߭טݦඔ׻၂ဢbиࣨđᄝ C ᇏ ҂ॖି׮෿֥Էࡹྍ֥ݦඔđ౼ս֥ٚم൞đᆃུܥק֥ C ݦඔ൐Ⴈ߭טіটथקૄՑ ႋھטႨଧ۱ Lua ݦඔb ༯၂҄൞ࢳ༅ٚمđڵᄳࢳ༅၂؍ XML ඔऌb෰Ⴕਆ۱ҕඔğࢳ༅ఖؓའ(ٚمሱ ࠭)ބ၂۱ॖ࿊֥၂؍ XML ඔऌb֒ીႵඔऌטႨᆃ۱ٚمൈđ෰๙ᆩ Expat ໓֖ၘࣜ ࢳ༅ࢲඏğ static int lxp_parse (lua_State *L) { int status; size_t len; const char *s; lxp_userdata *xpu; /* get and check first argument (should be a parser) */ xpu = (lxp_userdata *)luaL_checkudata(L, 1, "Expat"); luaL_argcheck(L, xpu, 1, "expat parser expected"); /* get second argument (a string) */ s = luaL_optlstring(L, 2, NULL, &len); /* prepare environment for handlers: */ /* put callback table at stack index 3 */ lua_settop(L, 2); lua_getref(L, xpu->tableref); xpu->L = L; /* set Lua state */ /* call Expat to parse string */ status = XML_Parse(xpu->parser, s, (int)len, s == NULL); /* return error code */ lua_pushboolean(L, status);
  230. Programming in Lua 230 Copyright ® 2005, Translation Team, www.luachina.net

    return 1; } ֒ lxp_parse טႨ XML_Parse ֥ൈީđ ު၂۱ݦඔࡼ߶ؓᄝ۳ק֥၂؍ XML ඔऌᇏ ᅳ֥֞෮Ⴕჭ෍đٳљטႨᆃུჭ෍ؓႋ֥ओѣb෮ၛđlxp_parse ߶൮ູ༵ᆃུओѣሙ Сߌ࣢đ ᄝטႨ XML_Parse ֥ൈީႵ၂ུ༥ࢫğ ࠺ᇾᆃ۱ݦඔ֥ቋު၂۱ҕඔۡු Expat ۳ק֥໓Ч؍൞ڎ൞ቋު၂؍b֒໡ૌ҂ջҕඔטႨ෰ൈđs ࡼ൐Ⴈಌസ֥ NULLđၹ Վᆃൈީቋު၂۱ҕඔࡼູ truebགྷᄝಞ໡ૌᇿၩ৯ࠢᇏ֞߭טݦඔ f_StartElementa f_EndElement ބ f_CharData ഈđᆃ೘۱ݦඔႵཌྷර֥ࢲܒğૄ၂۱׻߶ᆌؓ෰֥ᆷק൙ ࡱ࡟Ұ callback і൞ڎקၬਔ Lua ओѣđೂݔႵđყԩ৘ҕඔಖުטႨᆃ۱ Lua ओѣb ໡ૌ൮༵টु f_CharData ओѣđ ෰֥ս઒٤ӈࡥֆb ෲטႨ෰ؓႋ֥ Lua ᇏ֥ओѣ č֒թᄝ֥ൈީĎ đջႵਆ۱ҕඔğࢳ༅ఖ parser ބሳژඔऌč၂۱ሳژԱĎ static void f_CharData (void *ud, const char *s, int len) { lxp_userdata *xpu = (lxp_userdata *)ud; lua_State *L = xpu->L; /* get handler */ lua_pushstring(L, "CharacterData"); lua_gettable(L, 3); if (lua_isnil(L, -1)) { /* no handler? */ lua_pop(L, 1); return; } lua_pushvalue(L, 1); /* push the parser (`self') */ lua_pushlstring(L, s, len); /* push Char data */ lua_call(L, 2, 0); /* call the handler */ } ᇿၩđႮႿ֒໡ૌԷࡹࢳ༅ఖ֥ൈީטႨਔ XML_SetUserDatađ෮ၛđ෮Ⴕ֥ C ओ ѣ׻ࢤ൳ lxp_userdata ඔऌࢲܒቔֻູ၂۱ҕඔbߎေᇿၩӱ྽൞ೂޅ൐ႨႮ lxp_parse ഡᇂ֥ߌ࣢֥b൮༵đ෰ࡌק callback іᄝᅜᇏ֥෬ႄູ 3Ġֻؽđࡌקࢳ༅ఖ parser ᄝᅜᇏ෬ႄູ 1čparser ໊֥ᇂड़ק൞ᆃဢ֥đၹູෲႋھ൞ lxp_parse ֻ֥၂۱ҕඔĎ b f_EndElement ओѣބ f_CharData োරđ္ޓࡥֆb෰္൞Ⴈਆ۱ҕඔטႨཌྷႋ֥ Lua ओѣğ၂۱ࢳ༅ఖ parser ބ၂۱ѓద଀č္൞၂۱ሳژԱđ֌གྷᄝ൞ၛ '\0' ࢲແĎ ğ static void f_EndElement (void *ud, const char *name) { lxp_userdata *xpu = (lxp_userdata *)ud; lua_State *L = xpu->L;
  231. Programming in Lua 231 Copyright ® 2005, Translation Team, www.luachina.net

    lua_pushstring(L, "EndElement"); lua_gettable(L, 3); if (lua_isnil(L, -1)) { /* no handler? */ lua_pop(L, 1); return; } lua_pushvalue(L, 1); /* push the parser (`self') */ lua_pushstring(L, name); /* push tag name */ lua_call(L, 2, 0); /* call the handler */ } ቋު၂۱ओѣ f_StartElement ջႵ೘۱ҕඔğࢳ༅ఖ parserđѓద଀đބ၂۱උྟਙ іbᆃ۱ओѣбഈ૫ਆ۱഍ັگᄖׄđၹູ෱ླေࡼඋྟ֥ѓదਙіيၲӮ Lua ്љ֥ ଽಸb໡ૌ൞Ⴈሱಖ֥يၲٚൔđбೂđোර༯૫֥ष൓ѓదğ <to method="post" priority="high"> Ӂള༯૫֥උྟіğ { method = "post", priority = "high" } f_StartElement ֥ൌགྷೂ༯ğ static void f_StartElement (void *ud, const char *name, const char **atts) { lxp_userdata *xpu = (lxp_userdata *)ud; lua_State *L = xpu->L; lua_pushstring(L, "StartElement"); lua_gettable(L, 3); if (lua_isnil(L, -1)) { /* no handler? */ lua_pop(L, 1); return; } lua_pushvalue(L, 1); /* push the parser (`self') */ lua_pushstring(L, name); /* push tag name */ /* create and fill the attribute table */ lua_newtable(L); while (*atts) {
  232. Programming in Lua 232 Copyright ® 2005, Translation Team, www.luachina.net

    lua_pushstring(L, *atts++); lua_pushstring(L, *atts++); lua_settable(L, -3); } lua_call(L, 3, 0); /* call the handler */ } ࢳ༅ఖ֥ቋު၂۱ٚم൞ closeb֒໡ૌܱо၂۱ࢳ༅ఖ֥ൈީđ໡ૌсྶ൤٢ࢳ༅ ఖؓႋ֥෮Ⴕሧჷđࠧ Expat ࢲܒބ callback іb࠺ᇾđᄝࢳ༅ఖԷࡹ֥ݖӱᇏೂݔؿ ളհ༂đࢳ༅ఖѩ҂ႚႵᆃུሧჷğ static int lxp_close (lua_State *L) { lxp_userdata *xpu; xpu = (lxp_userdata *)luaL_checkudata(L, 1, "Expat"); luaL_argcheck(L, xpu, 1, "expat parser expected"); /* free (unref) callback table */ luaL_unref(L, LUA_REGISTRYINDEX, xpu->tableref); xpu->tableref = LUA_REFNIL; /* free Expat parser (if there is one) */ if (xpu->parser) XML_ParserFree(xpu->parser); xpu->parser = NULL; return 0; } ᇿၩ໡ૌᄝܱоࢳ༅ఖ֥ൈީđ൞ೂޅЌᆣ෱ԩႿ၂ᇁ֥čconsistentĎሑ෿֥,֒໡ ૌؓ၂۱ၘܱࣜо֥ࢳ༅ఖࠇᆀগࠍ൬ࠢఖၘࣜ൬ࠢᆃ۱ࢳ༅ఖᆭުđᄜՑܱоᆃ۱ࢳ ༅ఖ൞ીႵ໙ี֥bൌ࠽ഈđ໡ૌ൐Ⴈᆃ۱ݦඔቔູ໡ૌ֥༅ܒݦඔb෰ڵᄳЌᆣૄ၂ ۱ࢳ༅ఖሱ׮֤൤٢෰෮Ⴕ֥ሧჷđࠧ൐ӱ྽ჴીႵܱоࢳ༅ఖb ቋު၂҄൞յष९đࡼഈ૫۲۱҆ٳ٢ᄝ၂ఏbᆃظ໡ૌ൐Ⴈބ૫ཟؓའ֥ඔቆ২ ሰ č28.3 ࢫĎ ၂ဢ֥ٚσğ Էࡹ၂۱ metatableđ ࡼ෮Ⴕ֥ٚم٢ᄝᆃ۱іଽđ і֥__index თᆷཟሱ࠭bᆃဢđ໡ૌߎླေ၂۱ࢳ༅ఖٚم֥ਙіğ static const struct luaL_reg lxp_meths[] = { {"parse", lxp_parse}, {"close", lxp_close}, {"__gc", lxp_close}, {NULL, NULL}
  233. Programming in Lua 233 Copyright ® 2005, Translation Team, www.luachina.net

    }; ໡ૌ္ླေ၂۱ܱႿᆃ۱९ᇏ෮Ⴕݦඔ֥ਙіbބ OO ९ཌྷ๝֥൞đᆃ۱९ᆺႵ၂ ۱ݦඔđᆃ۱ݦඔڵᄳԷࡹ၂۱ྍ֥ࢳ༅ఖğ static const struct luaL_reg lxp_funcs[] = { {"new", lxp_make_parser}, {NULL, NULL} }; ቋᇔđopen ݦඔсྶေԷࡹ metatableđѩ๙ݖ__index ᆷཟіЧദđѩ౏ᇿҨٚم ބݦඔğ int luaopen_lxp (lua_State *L) { /* create metatable */ luaL_newmetatable(L, pat"); "Ex /* metatable.__index = metatable */ lua_pushliteral(L, "__index"); lua_pushvalue(L, -2); lua_rawset(L, -3); /* register methods */ xp_meths, 0); luaL_openlib (L, NULL, l /* register functions (only lxp.new) */ luaL_openlib (L, "lxp", lxp_funcs, 0); return 1; }