[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: [ANN] Smileua 1^.^0, a language that smiles
- From: Graham Wakefield <wakefield@...>
- Date: Mon, 22 Aug 2011 17:10:51 -0700
Tempting:
http://lolcode.com/implementations/lua-translator
On Aug 22, 2011, at 9:46 AM, Dimiter malkia Stanev wrote:
> Heh :) Cool!
>
> I did some "translating" with google, and it came as
>
> Lua Rindo (laughing moon), or Lua Sorrindo (smiling moon)
>
> hehehehe
>
> On 8/22/11 2:30 AM, Axel Kittenberger wrote:
>> Inspired by MoonScript I too made a compiles-to-lua-language to
>> sweeten your Monday. Decades over debates about syntax(1) of languages
>> and the rise and fall of languages was actually pendulum between the
>> two antagonists expressivity vs. error-prevention. Smileua on the
>> other hand opens a neglected new dimension! While it might be worse
>> than Lua on both of this old two dimensions it has this warm cozy
>> feeling of being smiled at and being appreciated when looking at the
>> code. The compiler(2) is of course(!) written in Smileua itself and
>> added to this email, so you can see how to code smiles at you. It
>> might look gibberish to the untrained eye, but isn't the smiley worth
>> it!? Since email tends to mangle source, you can get it here along
>> with the language definitions and an already self-compiled Lua-script
>> for boot strapping:
>> http://homepage.univie.ac.at/axel.kittenberger/smileua/index.html
>>
>> (1) but not semantics.
>> (2) compiler is an overstatement, actually preprocessor as it works on
>> token basis only
>>
>> (^.^)
>>
>> -------------------------------------------------------
>> #!/usr/bin/lua
>> smileua = {:
>> ["{:"] = {: r = "{" :},
>> [":}"] = {: r = "}" :},
>> [":~)"] = {: r = "not" :},
>> [":a)"] = {: r = "and" :},
>> [":o)"] = {: r = "or" :},
>> [":+)"] = {: r = "+" :},
>> [":-)"] = {: r = "-", nw = 1 :}, --:) no warn
>> [":*)"] = {: r = "*" :},
>> ["/:)"] = {: r = "/" :},
>> [":=)"] = {: r = "=", nw = 1 :},
>> [":==)"] = {: r = "==" :},
>> [":~=)"] = {: r = "~=" :},
>> [":>"] = {: r =">" :},
>> ["<:"] = {: r = "<" :},
>> [":=>"] = {: r =">=" :},
>> ["<=:"] = {: r = "<=" :},
>> ["[:?"] = {: r = "if" :},
>> ["[^:"] = {: r = "then" :},
>> [":^]"] = {: r = "else" :},
>> [":^]?"] = {: r = "elseif" :},
>> ["[:"] = {: r = "do" :},
>> [":]"] = {: r = "end" :},
>> ["(:"] = {: r = "(" :},
>> [":)"] = {: r = ")" :},
>> ["(:)"] = {: r = "()" :},
>> ["?:)"] = {: r = "for" :},
>> ["?:]"] = {: r = "while" :},
>> [":?}"] = {: r = "repeat" :},
>> ["{?:"] = {: r = "until" :},
>> ["=:}"] = {: r = "local" :},
>> ["^.^"] = {: r = "function" :},
>> ["\\o/"] = {: r = "return" :},
>> [":^)"] = {: r = "break" :},
>> :}
>> --:) copies reverses as warnings into the language table
>> [:
>> =:} warns = {: :}
>> ?:) k, v in pairs(:smileua:) [:
>> [:? :~) warns[v.r] :a) :~) v.nw [^: warns[v.r] = {: r = k, warn = 1 :} :]
>> :]
>> ?:) k, v in pairs(:warns:) [:
>> [:? :~) smileua[k] [^: smileua[k] = v :]
>> :]
>> :]
>> --:) argument handling
>> ^.^ err(:...:) io.stderr:write(:...:); os.exit(:1:) :]
>> [:? #arg :==) 1 :a) arg[1]:sub(:-3:) :==) ".8p" [^: arg[2] =
>> arg[1]:sub(:0, -3:).."lua" :]
>> [:? #arg :~=) 2 [^: err(:"Usage: ",arg[0]," [SMILEUA-IN] [LUA-OUT]\n":) :]
>> --:) load input
>> fi = io.open(:arg[1]:)
>> [:? :~) fi [^: err(:"Cannot read "..arg[1]:) :]
>> si = fi:read(:"*a":) --:) input string
>> [:? si :==) null [^: err(: "Cannot load "..arg[1] :) :]
>> fi:close(:)
>> pi = 1 --:) input pointer
>> ao = {: :} --:) output array
>> po = 1 --:) output pointer
>> ln = 1 --:) line nunmber
>> wc = 0 --:) number of warnings
>> alphanum = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
>> c = si:sub(:1, 1:) --:) current character
>> ^.^ string:has(:s:) \o/ self:find(:s, 1, true:) :]
>> --:) increments input pointer :a) get current char
>> ^.^ pinc(:n:)
>> [:? :~) n [^: n = 1 :]
>> pi = pi :+) n
>> c = si:sub(:pi, pi:)
>> cc = si:sub(:pi, pi :+) 1:)
>> [:? c :==) "\n" [^: ln = ln :+) 1 :]
>> :]
>> ^.^ opush(:o:) ao[po] = o; po = po :+) 1 :]
>> [:? c :==) "#" [^: --:) hashbang
>> :?} pinc(:); {?: c :==) "\n" :o) pi :> #si
>> pinc(:);
>> opush(:si:sub(:1, pi :-) 1:):)
>> :]
>> ?:] pi<=: #si [:
>> [:? (:" \t\n":):has(:c:) [^: --:) space
>> opush(:c:); pinc(:)
>> :^]? alphanum:has(:c:) [^: --:) normal token or number
>> =:} pis = pi
>> :?}
>> pinc(:)
>> {?: :~) alphanum:has(:c:) :o) pi :> #si
>> =:} t = si:sub(:pis, pi :-) 1:)
>> =:} ts = smileua[t]
>> [:? ts :a) ts.warn [^:
>> io.stderr:write(:ln,":) missed a smile. use ",ts.r," instead of ",t,"\n":)
>> wc = wc :+) 1
>> :]
>> opush(:t:)
>> :^]? c :==) "'" :o) c :==) '"' [^: --:) string constant
>> =:} pis = pi; =:} cs = c
>> :?} pinc(:); [:? c :==) "\\" [^: pinc(:) :] {?: c :==) cs :o) pi :> #si
>> pinc(:);
>> opush(:si:sub(:pis, pi :-) 1:):)
>> :^]? cc :==) "--" [^:
>> =:} pis = pi
>> :?} pinc(:) {?: c :==) "\n" :o) pi :> #si
>> opush(:si:sub(:pis, pi :-) 1:):)
>> :^]? cc :==) "[[" [^:
>> =:} pis = pi; :?} pinc(:) {?: cc :==) "]]" :o) pi :> #si
>> opush(:si:sub(:pis, pi :-) 1:):)
>> :^] --:) control chars
>> =:} tl = 4
>> ?:] tl :> 0 [:
>> =:} t = si:sub(:pi, pi :+) tl :-) 1:)
>> =:} v = smileua[t]
>> [:? v [^:
>> [:? v.warn [^:
>> io.stderr:write(:ln,":) missed a smile. use ",v.r," instead of ",t,"\n":)
>> opush(:t:); wc = wc :+) 1
>> :^]
>> opush(:v.r:)
>> :]
>> pinc(:tl:)
>> :^)
>> :]
>> tl = tl :-) 1
>> :]
>> [:? tl :==) 0 [^: opush(:c:); pinc(:) :]
>> :]
>> :]
>> [:? arg[2] :==) "-" [^:
>> fo = io.stdout
>> :^]
>> fo = io.open(:arg[2],"w":)
>> [:? :~) fo [^: err(: "Cannot write "..arg[2] :) :]
>> :]
>> fo:write(:table.concat(:ao:):)
>> fo:close(:)
>> [:? wc :> 0 [^: io.stderr:write(: "Missed ",wc," opportunities to
>> smiley\n" :) :]
>> ---------Eo)F-------
>>
>>
>
>