About
About TropeLang
TropeLang is a descriptive language for writing a story down as facts, and a live engine that recognizes the tropes those facts satisfy.
Who built this?
I'm Kelvin Nishikawa, a software engineer and language enthusiast. TropeLang is my personal project — a programming language for narrative development. You can follow the work and reach me on GitHub.
Philosophy
Prose for people, structure for machines. A story should stay readable while its shape becomes explicit enough to query, check, and recognize — the prose is for the reader, the structure is for everything else.
// the build-your-own-language archetype, as a TropeLang vignette
// every line is a fact; the engine reads the shape, not the words
char dev [+Protagonist] [+Maker]
char writer [+Newcomer]
obj language [+Tool] [+Structure] [+Meaning] [+Concealed]
set world [+Open]
concept stories
concept structure
concept authorship
// idea to MVP: a maker makes the thing, the thing works, the thing ships
rule Zero_to_One {
when:
char $m [+Maker]
evt $e [&Creates(agent=$m, target=$t)]
$t -> $out
then:
$t [+Shipped]
}
arc the_maker {
// ===== ACT I — the itch =====
// prose can hold a story, but you can't run a query against a paragraph
act the_itch {
beat 1 { dev -- stories : "loves them, wants to reason about them" }
// # = a state of mind
beat 2 { dev [#Restless] }
// ? = a seed: planted now, surfaced later
beat 3 { ?dev [~Pursues(goal=structure)]? }
// concealed from the reader: this "tool" is really a work of authorship
beat 4 { ?language [+Authored]? }
}
// ===== ACT II — the build =====
// idea becomes MVP: a means quietly turns into the medium
act the_build {
beat 1 { evt forge [&Creates(agent=dev, target=language)] }
// > = holds
beat 2 { dev > language : "holds the thing they made" }
// -> = causes
beat 3 { language -> stories : "lets a machine read twriter shape" }
beat 4 { dev -- language : "starts to think in it" }
// the reveal fires Tomato_Surprise — the concealed work, surfaced
beat 5 {
evt admits [&Reveals(agent=dev, subject=language, fact=authorship)]
!language [+Authored]!
}
}
// ===== ACT III — a life of its own =====
// out in the world now, ripe with potential
act a_life_of_its_own {
// Zero_to_One commits — the thing actually ships
beat 1 { language [+Shipped] }
// @ = located-at
beat 2 { language @ world : "out in the open; anyone can pick it up" }
// a newcomer takes it up — Chekhov's Gunman, in-flight: twriter decisive act is still unwritten
beat 3 { evt arrives [&Introduces(person=writer)] }
beat 4 { writer -- language : "takes it up" }
// * = contingent: potential, not yet spent
beat 5 { *language [+Generative]* }
// ? = latent: the rest isn't written yet
beat 6 { ?language [+Unwritten]? }
// ...and the vignette trails off here. who knows where it goes.
}
} Rationale
A language needn't target a computer. Any domain with a settled vocabulary can be given a grammar and made interpretable; literary theory is one of them, and TropeLang is that idea applied to narrative.