สนิม + โทกิโปนะ
ภาษาใดเป็นที่ยอมรับดังนั้นฉันเขียนโปรแกรมในRustที่สร้างบางประโยคในภาษาโทคิโพนา
Toki Pona เป็นความพยายามในการสร้างภาษาที่เป็นธรรมชาติเพียงเล็กน้อยและมีไวยากรณ์ที่เรียบง่ายและธรรมดา นั่นเป็นคุณสมบัติที่มีประโยชน์มากสำหรับการประกวดครั้งนี้!
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);
}
ฉันไม่พูด Toki Pona แต่ฉันพบว่าไวยากรณ์ของ Toki Pona เป็นชุดของกฎ BNFใน Wikipedia ฉันสร้างหนึ่ง struct หรือ enum สำหรับแต่ละกฎของ BNF และฉันใส่คำอธิบายประกอบไว้ด้วยderiving(Rand)
ซึ่งทำให้ฉันมีวิธีสร้างโครงสร้างแบบสุ่มPhrase
ฟรี! จากนั้นฉันนำไปใช้ToStr
สำหรับ structs เหล่านี้เพื่อแปลงเป็นสตริง
ฉันตั้งใจออกจากชื่อ struct เป็นภาษาฝรั่งเศสเพราะกฎ BNF ที่ฉันพบนั้นเป็นภาษาฝรั่งเศสและก็เพราะมันแสดงให้เห็นถึงลักษณะที่พูดได้หลายภาษาของการส่งของฉัน!
ตัวอย่างผลลัพธ์
บางคนเอาท์พุทและการแปลของพวกเขาว่าผมไม่อยู่บนพื้นฐานของกฎ BNFและพจนานุกรมภาษาโทคิโพนา ฉันแน่ใจว่าการแปลเหล่านี้ส่วนใหญ่ผิด แต่ Toki Pona ออกจากห้องไปมากสำหรับการตีความประโยค
nasin mi tawa la jan li jaki
ในขณะที่ฉันเดินทางมีคนปนเปื้อน
monsi li jaki li jan ike musi
ก้นสกปรกและเป็นคนเลวตลก
sina li tawa ale jelo e kili tawa e insa
คุณย้ายผลไม้และศูนย์กลางไปที่จักรวาลสีเหลือง
ประเด็น
- ฉันไม่ตรวจสอบว่าคำกริยาเป็นสกรรมกริยาหรือไม่ดังนั้นประโยคบางประโยคไม่ถูกต้องตามหลักไวยากรณ์
- structs บางตัวเกิดซ้ำและเมื่อกฎสามารถทำซ้ำได้ฉันสุ่มเลือกเอาท์พุทองค์ประกอบ 0, 1 หรือ 2 สิ่งนี้สามารถนำไปสู่การสร้างประโยคที่สร้างขึ้นมาอย่างยาวนานซึ่งมีคำหลายพันคำ ...
- ฉันไม่สามารถตรวจสอบความถูกต้องของผลลัพธ์ได้จริง ๆ ฉันต้องพึ่งพาไวยากรณ์ BNF พจนานุกรมและการคาดเดาที่เป็นตัวของตัวเองทั้งหมด :)