кругом кирилица в кодировке UTF-8 под Linux
Антиглобализм в языках программированя не коснулся python и mojo , но с учётом существующих альтернатив не слишком трудно написать кросс-компилятор с исконно славянского языка программирования в какой-нибудь "антиглобальный" - хоть в rust хоть даже в gnu as
Мы вот попробовали на mojo что-то такое сделать. Поскольку Python суть есмь "змий" , а змий - это как бы гад ползучий , то компилятор тоже можно назвать gad. ( или даже гад кирилицей ). На входе файлы на русском диалекте этого языка , а на выходе файлы для rust c расширением rs.
Прототип компилятора на языке mojo может выглядеть примерно так:
PHP Code:
from sys import argv
@value
struct MyRuntime:
var ok :Int
var status :String
var fname :String
var xmain :String
fn __init__(inout self):
self.status = "init"
self.fname = "?"
self.xmain = "?"
self.ok = 1
pass
fn setStatus(inout self,z :String):
self.status = z
fn setFname(inout self,z :String):
self.fname = z
pass
fn about(inout self) -> String:
return self.status
fn main():
print("гад , версия 1.0")
var bb = argv()
var rt = MyRuntime()
var need = False
for t in bb:
if need:
print("послушание (",t,")")
try:
servant(rt,t)
except:
print("ересь",rt.about())
need = True
print("аминь!")
fn servant(inout rt :MyRuntime,z :String) raises:
var qn = z.__add__(".гад")
var qp = z.__add__(".rs")
print(" готовим ",qn)
rt.setStatus("servant.open")
var f = open(qn,"r")
rt.setStatus("servant.read")
var bf = f.read()
rt.setStatus("servant.close")
f.close()
rt.setStatus("buildCode")
buildCode(rt,bf,qp)
fn buildCode(inout rt :MyRuntime,bf :String,outf :String) raises:
var f = open(outf,"w")
var dd = bf.split("\n")
var n = dd.__len__()
var i = 0
while i < n :
var s = dd.__getitem__(i)
var z = s.strip()
print("-->",z)
rt.ok = 0
var ix = z.find("пора ",0)
if ix == 0:
goPora(rt,z,f)
if rt.ok == 0:
ix = z.find("аминь",0)
if ix == 0:
goAmen(rt,z,f)
if rt.ok == 0:
ix = z.find("скрижаль ")
if ix == 0:
goPrint(rt,z,f)
i = i + 1
epilogue(rt,f)
f.close()
fn goPrint(inout rt :MyRuntime,bf :String,inout f :FileHandle) raises :
var k = bf.find(" ")
var qq = bf[k+1:-1]
rt.ok = 1
f.write("println!(\"")
f.write(qq)
f.write("\")\n")
fn goAmen(inout rt :MyRuntime,bf :String,inout f :FileHandle) raises :
rt.ok = 1
f.write("}\n")
pass
fn goPora(inout rt :MyRuntime,bf :String,inout f :FileHandle) raises :
rt.setStatus("genPora")
rt.ok = 1
f.write("fn ")
var z = bf.split(" ")
var p = z.__getitem__(1)
rt.setFname(p)
f.write(p)
f.write("() {\n")
var g = z.__getitem__(2)
if g.__eq__("поехали"):
rt.xmain = p
pass
fn epilogue(inout rt :MyRuntime,inout f :FileHandle) raises :
if rt.xmain.__ne__("?"):
f.write("\n")
f.write("fn main() {\n")
f.write(rt.xmain)
f.write("()\n")
f.write("}\n")
pass
входная программа на языке gad как-то так:
PHP Code:
пора привет поехали
скрижаль бог в помощь!
аминь
ну а после обработки компилятором gad на выходе получаем файл для rust:
PHP Code:
fn привет() {
println!("бог в помощь")
}
fn main() {
привет()
}