on master help sign in
function stat
commit9f2556b8a2bd2d7745a9fba8b865006cbc22ecad authoriko <mail@iko.soy> dateSun 21 Jul 2024, 19:07 (2 years ago) parent177d078
4 files changed+133
zod/luau/lib/lua/parser.hoon+64 zod/luau/lib/lua/printer.hoon+55 zod/luau/sur/lua.hoon+5 zod/luau/tests/foo.lua+9
zod/luau/lib/lua/parser.hoon+64
@@ -306,6 +306,10 @@ apex
306306 %+ cook
307307 |= =for-in [%for-in for-in]
308308 parse-for-in
309+ ::
310+ %+ cook
311+ |= =function [%function function]
312+ parse-function
309313 ==
310314++ parse-for-range
311315 %^ tnee %for-range for-range
@@ -339,6 +343,66 @@ apex
339343 wss
340344 (jest 'end')
341345 ==
346+++ parse-function
347+ %^ tnee %parse-function function
348+ %+ cook
349+ |= [* * name=funcname * body=funcbody]
350+ [name body]
351+ ;~ plug
352+ (jest 'function')
353+ wss
354+ parse-funcname
355+ ws
356+ parse-funcbody
357+ ==
358+++ parse-funcname
359+ %^ tnee %parse-funcname funcname
360+ ;~ plug
361+ %+ most dot parse-name
362+ ::
363+ %- punt
364+ ;~ pfix
365+ col
366+ parse-name
367+ ==
368+ ==
369+++ parse-funcbody
370+ %^ tnee %parse-funcbody funcbody
371+ %+ cook
372+ |= [* * pars=parlist * * * body=blok * *] [pars body]
373+ ;~ plug
374+ (just '(')
375+ ws
376+ parse-parlist
377+ ws
378+ (just ')')
379+ ws
380+ parse-blok
381+ wss
382+ (jest 'end')
383+ ==
384+++ parse-parlist
385+ %^ tnee %parse-parlist parlist
386+ ;~ pose
387+ %+ cold [~ &]
388+ (jest '...')
389+ ::
390+ ;~ plug
391+ %+ most (ifix [ws ws] com) parse-name
392+ ::
393+ %+ cook
394+ |= wildcard=(unit *) !.=(~ wildcard)
395+ %- punt
396+ ;~ plug
397+ ws
398+ com
399+ ws
400+ (jest '...')
401+ ==
402+ ==
403+ ::
404+ (easy [~ |])
405+ ==
342406++ parse-for-in
343407 %^ tnee %parse-for-in for-in
344408 %+ cook
zod/luau/lib/lua/printer.hoon+55
@@ -207,6 +207,7 @@ print
207207 %if (print-if +.stat)
208208 %for-range (print-for-range +.stat)
209209 %for-in (print-for-in +.stat)
210+ %function (print-function +.stat)
210211 ==
211212:: for-in
212213::
@@ -253,6 +254,55 @@ print
253254 (print-blok body.for-range)
254255 "\0aend"
255256 ==
257+:: function
258+::
259+++ print-function
260+ |= =function
261+ ^- tape
262+ %- zing
263+ :~
264+ "function "
265+ (print-funcname name.function)
266+ (print-funcbody body.function)
267+ ==
268+:: funcname
269+::
270+++ print-funcname
271+ |= =funcname
272+ ^- tape
273+ %- zing
274+ :~
275+ (dotted (turn nested.funcname trip))
276+ ::
277+ ?~ with-self.funcname ""
278+ %- zing ~[":" (trip u.with-self.funcname)]
279+ ==
280+:: funcbody
281+::
282+++ print-funcbody
283+ |= =funcbody
284+ ^- tape
285+ %- zing
286+ :~
287+ "("
288+ (print-parlist pars.funcbody)
289+ ")\0a"
290+ (print-blok body.funcbody)
291+ "\0aend"
292+ ==
293+:: parlist
294+::
295+++ print-parlist
296+ |= =parlist
297+ ^- tape
298+ %- zing
299+ :~
300+ (commaed (turn pars.parlist trip))
301+ ::
302+ ?. wildcard.parlist ""
303+ ?~ pars.parlist "..."
304+ ", ..."
305+ ==
256306:: if
257307::
258308++ print-if
@@ -359,6 +409,11 @@ print
359409 ^- tape
360410 %- zing
361411 %+ join "," l
412+++ dotted
413+ |= [l=(list tape)]
414+ ^- tape
415+ %- zing
416+ %+ join "." l
362417++ show-s
363418 |=(s=@s `tape`[?:((syn:si s) %$ '-') (slag 2 (scow %ui (abs:si s)))])
364419++ show-u
zod/luau/sur/lua.hoon+5
@@ -80,12 +80,17 @@
8080 [%break ~]
8181 [%for-range for-range]
8282 [%for-in for-in]
83+ [%function function]
8384 [%empty ~]
8485 ==
8586+$ explist (lest expr)
8687+$ for-range [var=name from=expr to=expr by=(unit expr) body=blok]
8788+$ for-in [vars=namelist src=explist body=blok]
8889+$ if [cond=expr body=blok elsa=(list [cond=expr body=blok]) else=(unit blok)]
90++$ function [name=funcname body=funcbody]
91++$ funcname [nested=(lest name) with-self=(unit name)]
92++$ funcbody [pars=parlist body=blok]
93++$ parlist [pars=(list name) wildcard=?]
8994+$ functioncall
9095 $%
9196 [%call func=prefix-expr =args]
zod/luau/tests/foo.lua+9
@@ -87,3 +87,12 @@ for key, val in pairs(u) do
8787 print(key, val)
8888end
8989
90+function Dog:new()
91+ newObj = {sound = 'woof'}
92+ self.__index = self
93+ return setmetatable(newObj, self)
94+end
95+
96+function Dog:makeSound()
97+ print('I say ' .. self.sound)
98+end