We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.
Plurple
| Paradigm(s) | Object based |
|---|---|
| Designed by | User:Laclale |
| Appeared in | 2022 |
| Computational class | Maybe Turing complete |
| Major implementations | Currently Unimplemented |
| File extension(s) | .ppl, but any textual can be |
- This article is not detailed enough and needs to be expanded. Please help us by adding some more information.
Plurple is an esoteric programming language by User:Laclale.
Why Plurple?
"Programming Language Using Role-Playing Syntax", with "le".
Syntax
Sigil and Space
Plurple has Spaceless Syntax and Sigilless Syntax. Shows both in commands, but you can replace ":-;." to space, or add space to near of that sigil.
":"is start sigil."-"is connect sigil."." ";"is end sigil. Metatext for these exists.":"→"[Start]""-"→"[Minus]""."→"[Dot]"";"→"[End]"
- Due to this, only 4 type of spaces will be kept in quote. However, metatext exists also.
- Space:
" "→"[Space]" - Horizonital tab:
"\t"→"[hTab]" - Vertical tab:
"\v"→"[vTab]" - New line:
"\n"→"[LF]"
- Space:
Calculatives
If you use these on the right side of <stat> or position of group, you can't get created value. Instead, it calculates. ([] aka metatext also works.)
| Calculative | E.g. |
|---|---|
+ |
5 + 2 ⇒ 7
|
-([Minus]) |
5 - 2 ⇒ 3
|
* |
5 * 2 ⇒ 10
|
/ |
5 / 2 ⇒ 2
|
% |
5 % 2 ⇒ 1
|
^ |
5 ^ 2 ⇒ 25
|
= |
a == b
|
~ |
a ~= b
|
>([Less]) |
a > b
|
<([More]) |
a <= b
|
not |
not a
|
or |
a or b
|
and |
a and b
|
Also, some depend on implements.
@ prefix
Use prefix @ to any group, to make foreach control of an array.
<group>[<number>]
This leads to the inside of the group(array). Many right side stat can have multiple [<number>]s, while the left side can't.
Commands
| Spaceless | Sigilless | Description |
|---|---|---|
ooc:▪▪▪ |
ooc ▪▪▪ |
Comment. Nothing does until first End sigil even if sigilless. Be careful with using any count of " in there.
|
d-<number> |
d<number> |
Returns random number, only sets highest value and lowest value is always 1. You can't use variable to there. |
<numberA>-d-<numberB> |
<number>d<number> |
Returns sum of <numberA> times called d<numberB>. You can't use variable to there also.
|
<stat>:up-<number> |
<stat> up <number> |
Increment. Variable allowed. |
<stat>:up! |
<stat> up! |
1 increment. You can replace "!" to end sigil.
|
<stat>:down-<number> |
<stat> down <number> |
Decrement. Variable allowed. |
<stat>:down! |
<stat> down! |
1 decrement. You can replace "!" to end sigil.
|
create:<menuA>-<menuB>-<stat> |
create <menuA> <menuB> <stat> |
Make new <menuA> <menuB> named <stat>.
|
<stat>:is-number |
<stat> is number |
Changes stat's type to number(Integer). stat can be <group>[<number>]. |
<stat>:is-quote |
<stat> is quote |
Changes stat's type to quote(String). stat can be <group>[<number>]. |
<stat>:is-melee |
<stat> is melee |
Changes stat's type to melee(Local). |
<stat>:is-ranged |
<stat> is ranged |
Changes stat's type to ranged(Global). |
<statA>:is-<statB> |
<statA> is <statB> |
Changes statA's value to statB's value. statA can be <group>[<number>]. For statB, {,} can be used for group(Array), ◆◆ can be used for skill(Function), but can't nest functions at once.
|
grind:<stat> |
grind <stat> |
Next in loop. If true, continues. Foreach loop's target is changed in this command. |
attack:<stat> |
attack <stat> |
If. This along with hit and miss will be set.
|
hit: |
hit |
Set with attack, and if that was True then run this block.
|
miss: |
miss |
Set with attack, and if that was False then run this block.
|
done! |
done! |
End block for hit, miss, menu, and fight. You can replace "!" to end sigil.
|
menu:<stat> |
menu <stat> |
Switch. This along with option will be set.
|
option:<stat> |
option <stat> |
Set with menu, and if menu's stat equal to this then run this block.
|
fight:<stat>-<number> |
fight <stat> <number> |
For loop. Creates initial melee stat and requires grind. |
fight:@<group> |
fight @<group> |
Foreach loop. Use target to control current one. Also requires grind.
|
<group>[<number>]:join-<stat> |
<group>[<number>] join <stat> |
Add stat to group, you can omit [] if adding to last. |
<group>[<number>]:leave! |
<group>[<number>] leave! |
Delete stat from group, you can omit [] if removing from last. You can replace "!" to end sigil.
|
use:<skill>-<group> |
use <skill> <group> |
Call function named <skill>, with sending <group> as targets(argument). |
result:<stat> |
result <stat> |
Return <stat> as used skill's result. |
say:<stat> |
say <stat> |
Output. Spaceless command like d<number> will be executed if said at once. Metatext can be used for output of sigil. |
Examples
Looping counter
ooc:My lua implementation doesn't allow this due to in Fandom. fight:first-1. fight:second-first. grind:second>0. say "*". second:down. done. say "[LF]". first up. done.
XKCD fish
ooc:Used targets as input. create ranged number acc. fight:@targets. attack (acc<0 or acc==256); hit: acc is 0. done. menu target. option:"x". acc up. option:"d". acc down. option:"k". acc is (acc ^ 2). option:"c". say acc. done. grind yes. ooc:this is valid. done.
DMC + Some Technomancer joke
create ranged number acc. acc is 0. menu target[1]. option:"DPS++". say "Not enough battery.". acc up. option:"FORTRUN". say "Too hot to run.". acc up. option:"ServoShell". say "I'm a teabot.". acc up. option:"Viper". say "Illegal spell chip detected.". acc up. done. attack (acc==0); hit: say:"'" say:target[1] say:"' is not recognized as an internal or external command,[LF]operable program or batch file." done.
llehSovreS
say target[1]. say " : the term '". say target[1]. say "' is not recognized as the name of a cmdlet, function, script file, or operable program.". say "[LF]". say "Check the spelling of the name, or if a path was included, verify that the path is correct and try again.".
If anybody comes up with any example programs, feel free to add them here.
Implementations
You can make your implement.