Rust + Toki Pona
Da jede Sprache akzeptiert wird, habe ich ein Programm in Rust geschrieben , das einige Sätze in Toki Pona erzeugt .
Toki Pona ist ein Versuch, eine minimale natürliche Sprache zu erschaffen, und es hat eine super einfache und regelmäßige Grammatik. Das ist eine sehr nützliche Eigenschaft für diesen Wettbewerb!
use std::rand;
#[deriving(Rand)]
struct Phrase { a: Option<~GNominal>, b: ~Sujet, c: ~Predicat }
#[deriving(Rand)]
enum Sujet { A(~GNominal), B(~SCompose) }
#[deriving(Rand)]
enum Predicat { C(~GVerbal), D(~PCompose) }
#[deriving(Rand)]
struct SCompose { a: ~Sujet, b: ~Sujet }
#[deriving(Rand)]
struct PCompose { a: ~Predicat, b: ~Predicat }
#[deriving(Rand)]
struct GNominal { a: ~nom::Nom, b: Multi<~adjectif::Adjectif> }
#[deriving(Rand)]
struct GVerbal { a: ~verbe::Verbe, b: Multi<~adjectif::Adjectif>, c: Multi<~ODirect> }
#[deriving(Rand)]
struct ODirect { a: ~GNominal}
#[deriving(Rand)]
enum Multi<T> { Zero, One(T), Two((T,T)) }
mod nom {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Nom {akesi,ala,ale,anpa,ante,ijo,ike,ilo,insa,jaki,jan,jo,kala,kalama,kama,kasi,ken,kili,kiwen,ko,kon,kule,kulupu,lape,lawa,len,lete,linja,lipu,luka,lupa,ma,mama,mani,meli,mi,mije,moku,moli,monsi,mun,musi,mute,nanpa,nasin,nena,nimi,noka,oko,olin,ona,pakala,pali,palisa,pana,pilin,pimeja,pini,pipi,poka,poki,pona,seli,selo,sewi,sijelo,sike,sina,sinpin,sitelen,sona,soweli,suli,suno,supa,suwi,tan,tawa,telo,tenpo,toki,tomo,tu,unpa,uta,utala,walo,wan,waso,wawa,weka,wile}
}
mod verbe {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Verbe {ante,awen,ijo,ike,jaki,jan,jo,kalama,kama,ken,kepeken,kule,kute,lape,lawa,lete,lili,lon,lukin,moku,moli,musi,mute,nasa,olin,open,pakala,pali,pana,pilin,pimeja,pini,pona,seli,sin,sitelen,sona,suli,suwi,tawa,telo,toki,tu,unpa,utala,wan,wawa,weka,wile,}
}
mod adjectif {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Adjectif {ala,ale,anpa,ante,awen,ike,insa,jaki,jan,jelo,kama,kin,kiwen,kon,kule,kute,kulupu,lape,laso,lawa,lete,lili,linja,loje,luka,lukin,mama,meli,mi,mije,moli,monsi,mun,musi,mute,nasa,ni,olin,ona,pali,pimeja,pini,poka,pona,sama,seli,sewi,sike,sin,sina,suli,suwi,taso,tawa,toki,tomo,unpa,uta,walo,wan,wawa,weka,wile,}
}
impl ToStr for Phrase {
fn to_str(&self) -> ~str {
self.a.as_ref().map_or(~"", |g| format!("{:s} la ", g.to_str()))
+ format!("{:s} li {:s}", self.b.to_str(), self.c.to_str())
}
}
impl ToStr for Sujet {
fn to_str(&self) -> ~str {
match *self {
A(ref v) => v.to_str(),
B(ref v) => v.to_str(),
}
}
}
impl ToStr for Predicat {
fn to_str(&self) -> ~str {
match *self {
C(ref v) => v.to_str(),
D(ref v) => v.to_str(),
}
}
}
impl ToStr for SCompose {
fn to_str(&self) -> ~str {
format!("{:s} en {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for PCompose {
fn to_str(&self) -> ~str {
format!("{:s} li {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for GNominal {
fn to_str(&self) -> ~str {
format!("{:s} {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for GVerbal {
fn to_str(&self) -> ~str {
format!("{:s} {:s} {:s}", self.a.to_str(), self.b.to_str(), self.c.to_str())
}
}
impl ToStr for ODirect {
fn to_str(&self) -> ~str {
format!("e {:s}", self.a.to_str())
}
}
impl<T: ToStr> ToStr for Multi<~T> {
fn to_str(&self) -> ~str {
match *self {
Zero => ~"",
One(ref v) => v.to_str(),
Two((ref v,ref w)) => format!("{:s} {:s}", v.to_str(), w.to_str()),
}
}
}
fn main() {
let phrase = rand::random::<Phrase>();
println!("{:s}\n{:?}", phrase.to_str(), phrase);
}
Ich spreche kein Toki Pona, aber ich habe die Syntax von Toki Pona als Satz von BNF-Regeln in Wikipedia gefunden. Ich habe für jede BNF-Regel eine Struktur oder eine Aufzählung erstellt und diese mit Anmerkungen versehen deriving(Rand)
, sodass ich eine Phrase
kostenlose Zufallsstruktur generieren kann ! Dann habe ich ToStr
für jede dieser Strukturen implementiert, um sie in eine Zeichenfolge zu konvertieren.
Ich habe die Strukturnamen absichtlich auf Französisch belassen, weil die BNF-Regeln, die ich gefunden habe, auf Französisch sind und auch, weil sie die Mehrsprachigkeit meines Beitrags wieder in den Vordergrund rücken!
Beispielausgaben
Einige Ausgaben und ihre Übersetzungen, die ich basierend auf den BNF-Regeln und einem Toki Pona-Wörterbuch gemacht habe . Ich bin mir sicher, dass diese Übersetzungen größtenteils falsch sind, aber Toki Pona lässt tatsächlich viel Raum für die Interpretation eines Satzes.
nasin mi tawa la jan li jaki
Während meiner Reise verschmutzte jemand
monsi li jaki li jan ike musi
Der Hintern ist schmutzig und ist eine lustige schlechte Person
sina li tawa ale jelo e kili tawa e insa
Sie haben die Frucht und das Zentrum in das gelbe Universum versetzt
Probleme
- Ich überprüfe nicht, ob ein Verb transitiv ist oder nicht, daher sind einige Sätze grammatikalisch falsch.
- Einige Strukturen sind rekursiv, und wenn eine Regel wiederholt werden kann, entscheide ich mich nach dem Zufallsprinzip für die Ausgabe von 0, 1 oder 2 Elementen. Dies kann zu sehr langen Sätzen führen, die Tausende von Wörtern enthalten ...
- Ich kann die Gültigkeit der Ausgabe nicht wirklich überprüfen, ich verlasse mich ausschließlich auf die BNF-Syntax, das Wörterbuch und meine eigenen wilden Vermutungen :)