Examine individual changes

Abuse Filter navigation (Home | Recent filter changes | Examine past edits | Abuse log)
Jump to navigation Jump to search

This page allows you to examine the variables generated by the Abuse Filter for an individual change.

Variables generated for this change

VariableValue
Edit count of the user (user_editcount)
1
Name of the user account (user_name)
'McGoron'
Age of the user account (user_age)
2617
Page ID (page_id)
0
Page namespace (page_namespace)
0
Page title (without namespace) (page_title)
'Reverse Polish Scheme'
Full page title (page_prefixedtitle)
'Reverse Polish Scheme'
Action (action)
'edit'
Edit summary/reason (summary)
'Introduce reverse polish scheme'
Old content model (old_content_model)
''
New content model (new_content_model)
'wikitext'
Old page wikitext, before the edit (old_wikitext)
''
New page wikitext, after the edit (new_wikitext)
'{{infobox proglang |name=Reverse Polish Scheme |paradigms=Imperative, Stack-Based, Functional |author=[[User:McGoron|Peter McGoron]] |year=2025 |class=Turing Complete |majorimpl=[https://github.com/mcgoron-peter/reverse-polish-scheme R4RS] |influence=Scheme, FORTH }} '''Reverse Polish Scheme''' (RPS) is a homoiconic, stack-based programming language with reified continuations. Its syntax is a subset of Scheme. RPS can only use <code>call/cc</code> to manipulate the stack and instruction pointer. Stack operations, returns from calls, closures, delimited continuations, and all sorts of other fun things can be created using RPS's <code>call/cc</code>. == Core == RPS syntax is a subset of Scheme. Line comments start with <code>;</code>. Nested block comments start with <code>#|</code> and end with <code>|#</code>. Writing a number, string, <code>#t</code>, or <code>#f</code> will push that literal value onto the stack. Writing an identifier will execute that identifier. A literal vector is introduced with <code>#(</code> and ends with <code>)</code>. A literal list (a linked list where each list cell is a vector of two elements) starts with ( and ends with ). The empty list (nil) is represented by (). A literal identifier is introduced with <code>'</code>. (Note that lists and vectors are not quoted.) A procedure is a linked list whose first element can be used for data storage, and whose tail is a linked list of instructions to execute. By convention, procedures that do not have any data to save in their first element have their first element be <code>#f</code>. If the interpreter hits the end of a procedure, it will halt. The following are the built in instructions. Instructions will execute and continue at the next instruction (exceptions are <code>call/cc</code> and <code>jump</code>). They will consume all specified arguments to them. {| class="wikitable" !Command !Description |- | style="text-align:center"| <code>proc to from call/cc</code> |The fundamental stack manipulator. Jump to <code>proc</code> with the continuation <code>cc</code> pushed to the stack. When <code>m cc jump</code> is called, control returns to the instruction after <code>call/cc</code>, except that the stack is the <code>m</code> values on the stack before the jump appended to the values on the stack from <code>from</code> inclusive to <code>to</code> exclusive at the site of call/cc's invocation. If <code>from</code> is <code>#f</code>, then it will capture the entire stack starting from <code>to</code> exclusive. |- | style="text-align:center"| <code>bool on-false on-true if</code> |If <code>bool</code> is <code>#f</code>, jump to the procedure <code>on-false</code>. Otherwise jump to the procedure <code>on-true</code>. |- | style="text-align:center"| <code>proc jump</code> |The next executed instruction will be the first instruction of <code>proc</code>. Note that is no return stack. |- | style="text-align:center"| <code>n vector</code> |Allocate a vector of <code>n</code> cells and push it to the stack. |- | style="text-align:center"| <code>vec vector-length</code> |Push the length in cells of <code>vec</code>. Returns <code>#f</code> if <code>vec</code> is not a vector. |- | style="text-align:center"| <code>vec n ref</code> |Push the <code>n</code>th cell of <code>vec</code> to the stack. |- | style="text-align:center"| <code>value n vec set!</code> |Set the <code>n</code>th cell of <code>vec</code> to <code>value</code>. |- | style="text-align:center"| <code>x y eqv?</code> |Pushes a boolean indicating if <code>x</code> and <code>y</code> are equivalent objects (i.e. the same vector or equal numbers). |- | style="text-align:center"| <code>x symbol?</code> |Pushes a boolean indicating if <code>x</code> is a symbol. |- | style="text-align:center" | <code>x integer?</code> |Pushes a boolean indicating if <code>x</code> is an exact integer. |- | style="text-align:center" | <code>x real?</code> |Pushes a boolean indicating if <code>x</code> is a real. |- | style="text-align:center" | <code>x y +</code> | Pushes <code>x + y</code>. |- | style="text-align:center" | <code>x y *</code> | Pushes <code>x * y</code>. |} == Examples == The stack is notated as if it was a LISP list. The first element of the list is the top of the stack. The following code will duplicate the top of the stack. 1 (#f jump) #f 1 call/cc Explanation: * 1, a procedure, <code>#f</code>, 1 are pushed to the stack. The stack looks like <code>(1 #f &lt;proc&gt; 1 x values ...)</code>. * <code>call/cc</code> is invoked. It will jump to <code>&lt;proc&gt;</code> with the stack <code>(&lt;cc&gt; 1 x values ...)</code>. * <code>&lt;cc&gt;</code> is jumped into with the argument <code>1</code>. It will return to the position after the invocation of <code>call/cc</code>, pushing <code>x</code> onto a stack that was the stack at the invocation of <code>call/cc</code>, sans one element (the first 1 pushed). Hence the stack is <code>(x x values ...)</code>. This code is normally inlined and used as a macro. A Lisp interpreter can be used as a value-level macro processor for RPS. Since there is no lexical scope, there is no need for hygienic macros. Quasiquote works well to splice in code. [[Category:Languages]] [[Category:Functional paradigm]] [[Category:2025]] [[Category:Stack-based]] [[Category:Turing complete]] [[Category:No IO]] [[Category:Implemented]]'
Unified diff of changes made by edit (edit_diff)
'@@ -1,0 +1,94 @@ +{{infobox proglang +|name=Reverse Polish Scheme +|paradigms=Imperative, Stack-Based, Functional +|author=[[User:McGoron|Peter McGoron]] +|year=2025 +|class=Turing Complete +|majorimpl=[https://github.com/mcgoron-peter/reverse-polish-scheme R4RS] +|influence=Scheme, FORTH +}} + +'''Reverse Polish Scheme''' (RPS) is a homoiconic, stack-based programming language with reified continuations. Its syntax is a subset of Scheme. +RPS can only use <code>call/cc</code> to manipulate the stack and instruction pointer. Stack operations, returns from calls, closures, delimited continuations, and all sorts of other fun things can be created using RPS's <code>call/cc</code>. + +== Core == + +RPS syntax is a subset of Scheme. + +Line comments start with <code>;</code>. Nested block comments start with <code>#|</code> and end with <code>|#</code>. Writing a number, string, <code>#t</code>, or <code>#f</code> will push that literal value onto the stack. Writing an identifier will execute that identifier. + +A literal vector is introduced with <code>#(</code> and ends with <code>)</code>. A literal list (a linked list where each list cell is a vector of two elements) starts with ( and ends with ). The empty list (nil) is represented by (). A literal identifier is introduced with <code>'</code>. (Note that lists and vectors are not quoted.) + +A procedure is a linked list whose first element can be used for data storage, and whose tail is a linked list of instructions to execute. By convention, procedures that do not have any data to save in their first element have their first element be <code>#f</code>. + +If the interpreter hits the end of a procedure, it will halt. + +The following are the built in instructions. Instructions will execute and continue at the next instruction (exceptions are <code>call/cc</code> and <code>jump</code>). They will consume all specified arguments to them. + +{| class="wikitable" +!Command +!Description +|- +| style="text-align:center"| <code>proc to from call/cc</code> +|The fundamental stack manipulator. Jump to <code>proc</code> with the continuation <code>cc</code> pushed to the stack. When <code>m cc jump</code> is called, control returns to the instruction after <code>call/cc</code>, except that the stack is the <code>m</code> values on the stack before the jump appended to the values on the stack from <code>from</code> inclusive to <code>to</code> exclusive at the site of call/cc's invocation. If <code>from</code> is <code>#f</code>, then it will capture the entire stack starting from <code>to</code> exclusive. +|- +| style="text-align:center"| <code>bool on-false on-true if</code> +|If <code>bool</code> is <code>#f</code>, jump to the procedure <code>on-false</code>. Otherwise jump to the procedure <code>on-true</code>. +|- +| style="text-align:center"| <code>proc jump</code> +|The next executed instruction will be the first instruction of <code>proc</code>. Note that is no return stack. +|- +| style="text-align:center"| <code>n vector</code> +|Allocate a vector of <code>n</code> cells and push it to the stack. +|- +| style="text-align:center"| <code>vec vector-length</code> +|Push the length in cells of <code>vec</code>. Returns <code>#f</code> if <code>vec</code> is not a vector. +|- +| style="text-align:center"| <code>vec n ref</code> +|Push the <code>n</code>th cell of <code>vec</code> to the stack. +|- +| style="text-align:center"| <code>value n vec set!</code> +|Set the <code>n</code>th cell of <code>vec</code> to <code>value</code>. +|- +| style="text-align:center"| <code>x y eqv?</code> +|Pushes a boolean indicating if <code>x</code> and <code>y</code> are equivalent objects (i.e. the same vector or equal numbers). +|- +| style="text-align:center"| <code>x symbol?</code> +|Pushes a boolean indicating if <code>x</code> is a symbol. +|- +| style="text-align:center" | <code>x integer?</code> +|Pushes a boolean indicating if <code>x</code> is an exact integer. +|- +| style="text-align:center" | <code>x real?</code> +|Pushes a boolean indicating if <code>x</code> is a real. +|- +| style="text-align:center" | <code>x y +</code> +| Pushes <code>x + y</code>. +|- +| style="text-align:center" | <code>x y *</code> +| Pushes <code>x * y</code>. +|} + +== Examples == + +The stack is notated as if it was a LISP list. The first element of the list is the top of the stack. + +The following code will duplicate the top of the stack. + + 1 (#f jump) #f 1 call/cc + +Explanation: + +* 1, a procedure, <code>#f</code>, 1 are pushed to the stack. The stack looks like <code>(1 #f &lt;proc&gt; 1 x values ...)</code>. +* <code>call/cc</code> is invoked. It will jump to <code>&lt;proc&gt;</code> with the stack <code>(&lt;cc&gt; 1 x values ...)</code>. +* <code>&lt;cc&gt;</code> is jumped into with the argument <code>1</code>. It will return to the position after the invocation of <code>call/cc</code>, pushing <code>x</code> onto a stack that was the stack at the invocation of <code>call/cc</code>, sans one element (the first 1 pushed). Hence the stack is <code>(x x values ...)</code>. + +This code is normally inlined and used as a macro. A Lisp interpreter can be used as a value-level macro processor for RPS. Since there is no lexical scope, there is no need for hygienic macros. Quasiquote works well to splice in code. + +[[Category:Languages]] +[[Category:Functional paradigm]] +[[Category:2025]] +[[Category:Stack-based]] +[[Category:Turing complete]] +[[Category:No IO]] +[[Category:Implemented]] '
New page size (new_size)
5407
Old page size (old_size)
0
Lines added in edit (added_lines)
[ 0 => '{{infobox proglang', 1 => '|name=Reverse Polish Scheme', 2 => '|paradigms=Imperative, Stack-Based, Functional', 3 => '|author=[[User:McGoron|Peter McGoron]]', 4 => '|year=2025', 5 => '|class=Turing Complete', 6 => '|majorimpl=[https://github.com/mcgoron-peter/reverse-polish-scheme R4RS]', 7 => '|influence=Scheme, FORTH', 8 => '}}', 9 => '', 10 => ''''Reverse Polish Scheme''' (RPS) is a homoiconic, stack-based programming language with reified continuations. Its syntax is a subset of Scheme.', 11 => 'RPS can only use <code>call/cc</code> to manipulate the stack and instruction pointer. Stack operations, returns from calls, closures, delimited continuations, and all sorts of other fun things can be created using RPS's <code>call/cc</code>.', 12 => '', 13 => '== Core ==', 14 => '', 15 => 'RPS syntax is a subset of Scheme.', 16 => '', 17 => 'Line comments start with <code>;</code>. Nested block comments start with <code>#|</code> and end with <code>|#</code>. Writing a number, string, <code>#t</code>, or <code>#f</code> will push that literal value onto the stack. Writing an identifier will execute that identifier.', 18 => '', 19 => 'A literal vector is introduced with <code>#(</code> and ends with <code>)</code>. A literal list (a linked list where each list cell is a vector of two elements) starts with ( and ends with ). The empty list (nil) is represented by (). A literal identifier is introduced with <code>'</code>. (Note that lists and vectors are not quoted.)', 20 => '', 21 => 'A procedure is a linked list whose first element can be used for data storage, and whose tail is a linked list of instructions to execute. By convention, procedures that do not have any data to save in their first element have their first element be <code>#f</code>.', 22 => '', 23 => 'If the interpreter hits the end of a procedure, it will halt.', 24 => '', 25 => 'The following are the built in instructions. Instructions will execute and continue at the next instruction (exceptions are <code>call/cc</code> and <code>jump</code>). They will consume all specified arguments to them.', 26 => '', 27 => '{| class="wikitable"', 28 => '!Command', 29 => '!Description', 30 => '|-', 31 => '| style="text-align:center"| <code>proc to from call/cc</code>', 32 => '|The fundamental stack manipulator. Jump to <code>proc</code> with the continuation <code>cc</code> pushed to the stack. When <code>m cc jump</code> is called, control returns to the instruction after <code>call/cc</code>, except that the stack is the <code>m</code> values on the stack before the jump appended to the values on the stack from <code>from</code> inclusive to <code>to</code> exclusive at the site of call/cc's invocation. If <code>from</code> is <code>#f</code>, then it will capture the entire stack starting from <code>to</code> exclusive.', 33 => '|-', 34 => '| style="text-align:center"| <code>bool on-false on-true if</code>', 35 => '|If <code>bool</code> is <code>#f</code>, jump to the procedure <code>on-false</code>. Otherwise jump to the procedure <code>on-true</code>.', 36 => '|-', 37 => '| style="text-align:center"| <code>proc jump</code>', 38 => '|The next executed instruction will be the first instruction of <code>proc</code>. Note that is no return stack.', 39 => '|-', 40 => '| style="text-align:center"| <code>n vector</code>', 41 => '|Allocate a vector of <code>n</code> cells and push it to the stack.', 42 => '|-', 43 => '| style="text-align:center"| <code>vec vector-length</code>', 44 => '|Push the length in cells of <code>vec</code>. Returns <code>#f</code> if <code>vec</code> is not a vector.', 45 => '|-', 46 => '| style="text-align:center"| <code>vec n ref</code>', 47 => '|Push the <code>n</code>th cell of <code>vec</code> to the stack.', 48 => '|-', 49 => '| style="text-align:center"| <code>value n vec set!</code>', 50 => '|Set the <code>n</code>th cell of <code>vec</code> to <code>value</code>.', 51 => '|-', 52 => '| style="text-align:center"| <code>x y eqv?</code>', 53 => '|Pushes a boolean indicating if <code>x</code> and <code>y</code> are equivalent objects (i.e. the same vector or equal numbers).', 54 => '|-', 55 => '| style="text-align:center"| <code>x symbol?</code>', 56 => '|Pushes a boolean indicating if <code>x</code> is a symbol.', 57 => '|-', 58 => '| style="text-align:center" | <code>x integer?</code>', 59 => '|Pushes a boolean indicating if <code>x</code> is an exact integer.', 60 => '|-', 61 => '| style="text-align:center" | <code>x real?</code>', 62 => '|Pushes a boolean indicating if <code>x</code> is a real.', 63 => '|-', 64 => '| style="text-align:center" | <code>x y +</code>', 65 => '| Pushes <code>x + y</code>.', 66 => '|-', 67 => '| style="text-align:center" | <code>x y *</code>', 68 => '| Pushes <code>x * y</code>.', 69 => '|}', 70 => '', 71 => '== Examples ==', 72 => '', 73 => 'The stack is notated as if it was a LISP list. The first element of the list is the top of the stack.', 74 => '', 75 => 'The following code will duplicate the top of the stack.', 76 => '', 77 => ' 1 (#f jump) #f 1 call/cc', 78 => '', 79 => 'Explanation:', 80 => '', 81 => '* 1, a procedure, <code>#f</code>, 1 are pushed to the stack. The stack looks like <code>(1 #f &lt;proc&gt; 1 x values ...)</code>.', 82 => '* <code>call/cc</code> is invoked. It will jump to <code>&lt;proc&gt;</code> with the stack <code>(&lt;cc&gt; 1 x values ...)</code>.', 83 => '* <code>&lt;cc&gt;</code> is jumped into with the argument <code>1</code>. It will return to the position after the invocation of <code>call/cc</code>, pushing <code>x</code> onto a stack that was the stack at the invocation of <code>call/cc</code>, sans one element (the first 1 pushed). Hence the stack is <code>(x x values ...)</code>.', 84 => '', 85 => 'This code is normally inlined and used as a macro. A Lisp interpreter can be used as a value-level macro processor for RPS. Since there is no lexical scope, there is no need for hygienic macros. Quasiquote works well to splice in code.', 86 => '', 87 => '[[Category:Languages]]', 88 => '[[Category:Functional paradigm]]', 89 => '[[Category:2025]]', 90 => '[[Category:Stack-based]]', 91 => '[[Category:Turing complete]]', 92 => '[[Category:No IO]]', 93 => '[[Category:Implemented]]' ]
Unix timestamp of change (timestamp)
'1750043379'