Execute CopyPasta Language: Difference between revisions
m
→{{header|Wren}}: Changed to Wren S/H
SqrtNegInf (talk | contribs) (Added Perl example) |
m (→{{header|Wren}}: Changed to Wren S/H) |
||
(8 intermediate revisions by 6 users not shown) | |||
Line 16:
|}
<br>
=={{header|11l}}==
{{trans|Python}}
<syntaxhighlight lang="11l">:start:
V source = File(:argv[1]).read()
V lines = source.split("\n")
V clipboard = ‘’
V loc = 0
L loc < lines.len
V command = lines[loc].trim(‘ ’)
X.try
I (command == ‘Copy’)
clipboard ‘’= lines[loc + 1]
E I (command == ‘CopyFile’)
I (lines[loc + 1] == ‘TheF*ckingCode’)
clipboard ‘’= source
E
V filetext = File(lines[loc + 1]).read()
clipboard ‘’= filetext
E I (command == ‘Duplicate’)
clipboard ‘’= clipboard * ((Int(lines[loc + 1])) - 1)
E I (command == ‘Pasta!’)
print(clipboard)
L.break
E
exit(‘unknown command '’command‘' encountered on line ’(loc + 1))
X.catch
exit(‘error while executing command '’command‘' on line ’(loc + 1))
loc += 2</syntaxhighlight>
=={{header|C++}}==
{{trans|Nanoquery}}
<
#include <iostream>
#include <sstream>
Line 151 ⟶ 186:
// return in case we never hit a 'Pasta!' statement
return 0;
}</
The following files were used for testing:
Line 236 ⟶ 271:
8. When the program is about to end and the contents of the clipboard have (when appropriate) been printed out, the clipboard should be cleared.
<
package main
Line 325 ⟶ 360:
err = clipboard.WriteAll("") // clear clipboard
check(err)
}</
{{out}}
Line 379 ⟶ 414:
=={{header|Java}}==
{{trans|Nanoquery}}
<
import java.nio.file.Files;
import java.util.ArrayList;
Line 463 ⟶ 498:
}
}
}</
The following files were used for testing:
Line 527 ⟶ 562:
=={{header|Julia}}==
<
function interpretCopyPasta()
clipboard = String[]
Line 566 ⟶ 601:
interpretCopyPasta()
</
If run on the following CopyPasta "code" file:
<pre>
Line 608 ⟶ 643:
=={{header|Nanoquery}}==
<
def fatal_error(errtext)
println "%" + errtext
Line 661 ⟶ 696:
// increment past the command and the next line
loc += 2
end</
The following files were used for testing:
Line 723 ⟶ 758:
usage: copypasta.nq [filename.cp]
</pre>
=={{header|Nim}}==
<syntaxhighlight lang="nim">import os, strutils
type CopyPastaError = object of CatchableError
template raiseError(message: string, linenum = 0) =
let prefix = if linenum != 0: "Line $1: ".format(linenum) else: ""
raise newException(CopyPastaError, prefix & message)
proc copyPasta() =
## Load and execute a program.
var clipboard: string
if paramCount() != 1:
echo "usage: ", getAppFilename().lastPathPart, " filename.cp"
quit QuitFailure
let path = paramStr(1)
let code = try: path.readFile()
except IOError: raiseError("Unable to read file “$1”.".format(path))
let lines = code.splitLines()
var linenum = 1 # Starting at index one for line number.
while linenum <= lines.len:
let command = lines[linenum - 1].strip()
case command
of "Copy":
if linenum == lines.len: raiseError("missing string to copy.", linenum)
clipboard.add lines[linenum]
of "CopyFile":
if linenum == lines.len: raiseError("missing file to copy from.", linenum)
let fpath = lines[linenum]
if fpath == "TheF*ckingCode":
clipboard.add code
else:
let text = try: fpath.readFile()
except IOError: raiseError("unable to read file “$1”.".format(fpath), linenum)
clipboard.add text
of "Duplicate":
if linenum == lines.len: raiseError("missing number of repetitions.", linenum)
let n = try: lines[linenum].parseInt()
except: raiseError("wrong number of repetitions.", linenum + 1)
clipboard.add repeat(clipboard, n)
of "Pasta!":
stdout.write clipboard
break
of "": # Empty mine: skip.
inc linenum
continue
else:
raiseError("unknown command “$1”.".format(command), linenum)
inc linenum, 2
try:
copyPasta()
except CopyPastaError:
quit getCurrentExceptionMsg(), QuitFailure</syntaxhighlight>
{{out}}
<strong>File “prog1.cp”:</strong>
<pre>Copy
Rosetta Code
Duplicate
2
Pasta!</pre>
Result:
<pre>Rosetta CodeRosetta CodeRosetta Code</pre>
<strong>File “prog2.cp”:</strong>
<pre>CopyFile
pasta.txt
Duplicate
1
Pasta!</pre>
Result:
<pre>I'm the pasta.txt file.
I'm the pasta.txt file.</pre>
<strong>File “prog3.cp”:</strong>
<pre>Copy
Invalid
Duplicate
1
Goto
3
Pasta!</pre>
Result:
<pre>Line 6: unknown command “Goto”.</pre>
<strong>File “prog4.cp”:</strong>
<pre>CopyFile
TheF*ckingCode
Pasta!</pre>
Result:
<pre>CopyFile
TheF*ckingCode
Pasta!</pre>
<strong>File “prog5.cp”:</strong>
<pre>Copy
Rosetta code
Duplicate
A
Pasta!</pre>
Result:
<pre>Line 4: wrong number of repetitions.</pre>
=={{header|Perl}}==
<
use warnings;
use feature 'say';
use Path::Tiny;
Line 755 ⟶ 905:
"Copy\nRosetta Code\nDuplicate\n2\n\nPasta"
) {
}
unlink 'pasta.txt';</
{{out}}
<pre>Rosetta Code
Line 820 ⟶ 927:
If run without command-line parameters it fakes four runs.<br>
Assumes if clipboard is "hello ", Duplicate 2 should leave it as "hello hello hello ".
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">prog1_cp</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
Copy
Rosetta Code
Duplicate
2
Pasta!
La Vista
"""</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">prog2_cp</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
CopyFile
pasta.txt
Duplicate
1
Pasta!
"""</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">prog3_cp</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
Copy
Invalid
Duplicate
1
Goto
3
Pasta!
"""</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">pasta_txt</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
I'm the pasta.txt file.
"""</span><span style="color: #0000FF;">,</span>
<span style="color: #000000;">fake_files</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"prog1.cp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"prog2.cp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"prog3.cp"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"pasta.txt"</span><span style="color: #0000FF;">},</span>
<span style="color: #000000;">fake_texts</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> <span style="color: #000000;">prog1_cp</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">prog2_cp</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">prog3_cp</span> <span style="color: #0000FF;">,</span> <span style="color: #000000;">pasta_txt</span> <span style="color: #0000FF;">}</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">get_file_lines</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">lines</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fake_files</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fake_texts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">JS</span>
<span style="color: #008080;">or</span> <span style="color: #7060A8;">get_file_type</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)!=</span><span style="color: #004600;">FILETYPE_FILE</span> <span style="color: #008080;">then</span>
<span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"file not found:%s"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">get_text</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">,</span><span style="color: #004600;">GT_LF_STRIPPED</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">lines</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">interpret</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">filename</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\ninterpret(%s):\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">})</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">pgm</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">get_file_lines</span><span style="color: #0000FF;">(</span><span style="color: #000000;">filename</span><span style="color: #0000FF;">)&{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">}</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">clipboard</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">pc</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
<span style="color: #008080;">while</span> <span style="color: #004600;">true</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">pc</span><span style="color: #0000FF;">>=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pgm</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"No Pasta! Sucha mistaka to maka"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">cmd</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pgm</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pc</span><span style="color: #0000FF;">]),</span> <span style="color: #000000;">arg</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pgm</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pc</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">switch</span> <span style="color: #000000;">cmd</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">case</span> <span style="color: #008000;">"Copy"</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">clipboard</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">arg</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"\n"</span>
<span style="color: #008080;">case</span> <span style="color: #008000;">"CopyFile"</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">clipboard</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #000000;">arg</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"TheF*ckingCode"</span><span style="color: #0000FF;">?</span><span style="color: #000000;">pgm</span><span style="color: #0000FF;">:</span><span style="color: #000000;">get_file_lines</span><span style="color: #0000FF;">(</span><span style="color: #000000;">arg</span><span style="color: #0000FF;">)),</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">case</span> <span style="color: #008000;">"Duplicate"</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">clipboard</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">clipboard</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">to_integer</span><span style="color: #0000FF;">(</span><span style="color: #000000;">arg</span><span style="color: #0000FF;">)),</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">case</span> <span style="color: #008000;">"Pasta!"</span><span style="color: #0000FF;">:</span> <span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">clipboard</span><span style="color: #0000FF;">);</span> <span style="color: #008080;">return</span>
<span style="color: #008080;">case</span> <span style="color: #008000;">""</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">pc</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">;</span> <span style="color: #008080;">break</span> <span style="color: #000080;font-style:italic;">-- (skip blank lines [w/o arg])</span>
<span style="color: #008080;">else</span> <span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"unknown command: %s on line %d"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">cmd</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pc</span><span style="color: #0000FF;">})</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">switch</span>
<span style="color: #000000;">pc</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">2</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cl</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">command_line</span><span style="color: #0000FF;">()</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cl</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">4</span> <span style="color: #008080;">do</span>
<span style="color:
<span style="color: #000000;">interpret</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"prog%d.cp"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">catch</span> <span style="color: #000000;">e</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #004600;">E_USER</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">try</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cl</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">3</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">interpret</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cl</span><span style="color: #0000FF;">[</span><span style="color: #000000;">3</span><span style="color: #0000FF;">])</span>
<span style="color: #008080;">else</span>
<span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"usage: CopyPasta filename"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 921 ⟶ 1,032:
=={{header|Python}}==
{{trans|Nanoquery}}
<
# a function to handle fatal errors
Line 971 ⟶ 1,082:
# increment past the command and the next line
loc += 2
</syntaxhighlight>
The following files were used for testing:
Line 1,032 ⟶ 1,143:
%error while trying to read from specified file
usage: copypasta.nq [filename.cp]
</pre>
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" line>sub CopyPasta ($code) {
my @code = $code.split("\n")>>.trim.grep: *.so;
return "Program never ends!" unless grep { $_ eq 'Pasta!' }, @code;
my @cb;
my $PC = 0;
loop {
given @code[$PC] {
when 'Copy' { @cb.push: @code[++$PC] }
when 'CopyFile' { $PC++; @cb.push: @code[$PC] eq 'TheF*ckingCode' ?? @code !! slurp @code[$PC] }
when 'Duplicate' { @cb = (flat @cb) xx @code[++$PC] }
when 'Pasta!' { return @cb }
default { return "Does not compute: @code[$PC]" }
}
$PC++;
}
}
spurt 'pasta.txt', "I'm the pasta.txt file.";
(say $_ for .&CopyPasta; say '')
for
"Copy \nRosetta Code\n\tDuplicate\n2\n\nPasta!\nLa Vista",
"CopyFile\npasta.txt\nDuplicate\n1\nPasta!",
"Copy\nInvalid\n Duplicate\n1\n\nGoto\n3\nPasta!",
"CopyFile\nTheF*ckingCode\nDuplicate\n2\nPasta!",
"Copy\nRosetta Code\nDuplicate\n2\n\nPasta";
unlink 'pasta.txt';</syntaxhighlight>
{{out}}
<pre>Rosetta Code
Rosetta Code
I'm the pasta.txt file.
Does not compute: Goto
CopyFile TheF*ckingCode Duplicate 2 Pasta!
CopyFile TheF*ckingCode Duplicate 2 Pasta!
Program never ends!</pre>
=={{header|Wren}}==
{{trans|Go}}
<syntaxhighlight lang="wren">import "os" for Platform, Process
import "io" for File
var clipboard = "" // don't have access to real thing
var interpret = Fn.new { |source|
var source2 = source
if (Platform.isWindows) source2 = source.replace("\r\n", "\n")
var lines = source2.split("\n")
var le = lines.count
var i = 0
while (i < le) {
lines[i] = lines[i].trim() // ignore leading & trailing whitespace
if (lines[i] == "Copy") {
if (i == le - 1) Fiber.abort("There are no lines after the Copy command.")
i = i + 1
clipboard = lines[i]
} else if (lines[i] == "CopyFile") {
if (i == le - 1) Fiber.abort("There are no lines after the CopyFile command.")
i = i + 1
if (lines[i] == "TheF*ckingCode") {
clipboard = source
} else {
var s = File.read(lines[i])
clipboard = s
}
} else if (lines[i] == "Duplicate") {
if (i == le - 1) Fiber.abort("There are no lines after the Duplicate command.")
i = i + 1
var times = Num.fromString(lines[i])
if (times < 0) Fiber.abort("Can't duplicate text a negative number of times.")
var text = clipboard
clipboard = text * (times + 1)
} else if (lines[i] == "Pasta!") {
var text = clipboard
System.print(text)
return
} else {
if (lines[i] == "") {
i = i + 1
continue // ignore blank lines
}
Fiber.abort("Unknown command, %(lines[i])")
}
i = i + 1
}
}
var args = Process.arguments
if (args.count != 1) {
Fiber.abort("There should be exactly one command line argument, the CopyPasta file path.")
}
var s = File.read(args[0])
interpret.call(s)</syntaxhighlight>
{{out}}
<pre>
Similar to Go entry.
</pre>
=={{header|zkl}}==
<
pasta:=File(srcNm).read().howza(11); // zkl pastaprog.cp, stripped lines
foreach line in (pasta){
Line 1,066 ⟶ 1,283:
}catch(TheEnd){ error(w,"Error: End of file: ") }
catch{ error(w,wantInt and "Not an int: " or "Error: ") }
}</
Input programs:
<pre style="height:15ex">
|