Print itself: Difference between revisions
(Added Lua.) |
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
||
Line 9: | Line 9: | ||
{{omit from|Delphi}} |
{{omit from|Delphi}} |
||
=={{header|11l}}== |
=={{header|11l}}== |
||
< |
<syntaxhighlight lang="11l"> |
||
:start: |
:start: |
||
-V sourceFileName = fs:path:split_ext(:argv[0])[0]‘.11l’ |
-V sourceFileName = fs:path:split_ext(:argv[0])[0]‘.11l’ |
||
print(File(sourceFileName).read()) |
print(File(sourceFileName).read()) |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Batch File}}== |
=={{header|Batch File}}== |
||
< |
<syntaxhighlight lang="dos"> |
||
@echo off |
@echo off |
||
for /f "tokens=*" %%s in (%~n0%~x0) do (echo %%s) |
for /f "tokens=*" %%s in (%~n0%~x0) do (echo %%s) |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|FreeBASIC}}== |
=={{header|FreeBASIC}}== |
||
This works for Linux. |
This works for Linux. |
||
< |
<syntaxhighlight lang="freebasic">shell( "cat quine.bas" )</syntaxhighlight> |
||
=={{header|Furor}}== |
=={{header|Furor}}== |
||
<syntaxhighlight lang="furor"> |
|||
<lang Furor> |
|||
1 argv getfile dup sprint free |
1 argv getfile dup sprint free |
||
end |
end |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Go}}== |
=={{header|Go}}== |
||
< |
<syntaxhighlight lang="go">package main |
||
import ( |
import ( |
||
Line 49: | Line 49: | ||
} |
} |
||
fmt.Print(string(bytes)) |
fmt.Print(string(bytes)) |
||
}</ |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 62: | Line 62: | ||
A jq program that contains any JSON entity formatted as though by jq will print itself. The shortest such program would be a single digit, e.g.: |
A jq program that contains any JSON entity formatted as though by jq will print itself. The shortest such program would be a single digit, e.g.: |
||
<lang |
<syntaxhighlight lang="jq">0</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Example invocation: jq -n 0 |
Example invocation: jq -n 0 |
||
Line 72: | Line 72: | ||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
The running program's filename is referenced as the builtin PROGRAM_FILE variable in Julia. |
The running program's filename is referenced as the builtin PROGRAM_FILE variable in Julia. |
||
< |
<syntaxhighlight lang="julia">""" Read the program file and print it. """ |
||
printitself() = print(read(PROGRAM_FILE, String)) |
printitself() = print(read(PROGRAM_FILE, String)) |
||
printitself() |
printitself() |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Ksh}}== |
=={{header|Ksh}}== |
||
< |
<syntaxhighlight lang="ksh">#!/bin/ksh |
||
# Program to print it's own source code |
# Program to print it's own source code |
||
Line 88: | Line 88: | ||
while read line; do |
while read line; do |
||
print "${line}" |
print "${line}" |
||
done < $0</ |
done < $0</syntaxhighlight> |
||
=={{header|Lua}}== |
=={{header|Lua}}== |
||
< |
<syntaxhighlight lang="lua">-- arg[0] contains the name of the invoked script. |
||
print(io.open(arg[0]):read"*a")</ |
print(io.open(arg[0]):read"*a")</syntaxhighlight> |
||
=={{header|Nanoquery}}== |
=={{header|Nanoquery}}== |
||
<lang |
<syntaxhighlight lang="nanoquery">println new(Nanoquery.IO.File).open(args[1]).readAll()</syntaxhighlight> |
||
=={{header|Nim}}== |
=={{header|Nim}}== |
||
We suppose that the source file is in the same directory as the executable file. |
We suppose that the source file is in the same directory as the executable file. |
||
< |
<syntaxhighlight lang="nim">import os |
||
let execFile = getAppFilename() |
let execFile = getAppFilename() |
||
let sourceFile = execFile.addFileExt("nim") |
let sourceFile = execFile.addFileExt("nim") |
||
stdout.write sourceFile.readFile()</ |
stdout.write sourceFile.readFile()</syntaxhighlight> |
||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
< |
<syntaxhighlight lang="perl"># 20201011 added Perl programming solution |
||
use strict; |
use strict; |
||
Line 116: | Line 116: | ||
close($in) |
close($in) |
||
# @ARGV=$0; print <> # slurp without an explicit open()</ |
# @ARGV=$0; print <> # slurp without an explicit open()</syntaxhighlight> |
||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
Interpreted only: |
Interpreted only: |
||
< |
<syntaxhighlight lang="phix">puts(1,get_text(command_line()[2]))</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 126: | Line 126: | ||
</pre> |
</pre> |
||
Interpreted or compiled - latter only works while executable and source are still in the same directory, and not renamed. |
Interpreted or compiled - latter only works while executable and source are still in the same directory, and not renamed. |
||
< |
<syntaxhighlight lang="phix">puts(1,get_text(substitute(command_line()[2],".exe",".exw")))</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 133: | Line 133: | ||
</pre> |
</pre> |
||
Alternative - see the docs (ie phix.chm) for an explanation of the ("") and [1][2]: |
Alternative - see the docs (ie phix.chm) for an explanation of the ("") and [1][2]: |
||
< |
<syntaxhighlight lang="phix">?get_text(include_path("")&include_files()[1][2])</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 140: | Line 140: | ||
=={{header|PowerShell}}== |
=={{header|PowerShell}}== |
||
<syntaxhighlight lang="powershell"> |
|||
<lang PowerShell> |
|||
Write-Host $MyInvocation.MyCommand |
Write-Host $MyInvocation.MyCommand |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Python}}== |
=={{header|Python}}== |
||
{{works with|python3}} |
{{works with|python3}} |
||
< |
<syntaxhighlight lang="python">import sys |
||
with open(sys.argv[0],'r') as input: |
with open(sys.argv[0],'r') as input: |
||
for row in input: |
for row in input: |
||
print(row, end='')</ |
print(row, end='')</syntaxhighlight> |
||
=={{header|Raku}}== |
=={{header|Raku}}== |
||
Line 156: | Line 156: | ||
Is it supposed to be a quine? |
Is it supposed to be a quine? |
||
<lang |
<syntaxhighlight lang="raku" line>my &f = {say $^s, $^s.raku;}; f "my \&f = \{say \$^s, \$^s.raku;}; f " |
||
</syntaxhighlight> |
|||
</lang> |
|||
Or just a program that when executed echoes its source to STDOUT? (Here's probably the simplest valid program that when executed, echoes its source to STDOUT. It is exceptionally short: zero bytes; and when executed echoes zero bytes to STDOUT.) |
Or just a program that when executed echoes its source to STDOUT? (Here's probably the simplest valid program that when executed, echoes its source to STDOUT. It is exceptionally short: zero bytes; and when executed echoes zero bytes to STDOUT.) |
||
<syntaxhighlight lang="raku" line></syntaxhighlight> |
|||
<lang perl6></lang> |
|||
Or are we supposed to demonstrate how to locate the currently executing source code file and incidentally, print it. |
Or are we supposed to demonstrate how to locate the currently executing source code file and incidentally, print it. |
||
<lang |
<syntaxhighlight lang="raku" line>print $*PROGRAM.slurp</syntaxhighlight> |
||
Whatever. Any of these satisfy the rather vague specifications. |
Whatever. Any of these satisfy the rather vague specifications. |
||
=={{header|REXX}}== |
=={{header|REXX}}== |
||
< |
<syntaxhighlight lang="rexx">/*REXX program prints its own multi─line source to the standard output (stdout). */ |
||
do j=1 for sourceline() |
do j=1 for sourceline() |
||
call lineout , sourceline(j) |
call lineout , sourceline(j) |
||
end /*j*/ /*stick a fork in it, we're all done. */</ |
end /*j*/ /*stick a fork in it, we're all done. */</syntaxhighlight><br><br> |
||
=={{header|Ring}}== |
=={{header|Ring}}== |
||
< |
<syntaxhighlight lang="ring"> |
||
fileName = filename() |
fileName = filename() |
||
fp = fopen(fileName,"r") |
fp = fopen(fileName,"r") |
||
? read(filename()) |
? read(filename()) |
||
fclose(fp) |
fclose(fp) |
||
</syntaxhighlight> |
|||
</lang> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 192: | Line 192: | ||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
< |
<syntaxhighlight lang="ecmascript">import "os" for Process |
||
import "io" for File |
import "io" for File |
||
var args = Process.allArguments |
var args = Process.allArguments |
||
System.write(File.read(args[1]))</ |
System.write(File.read(args[1]))</syntaxhighlight> |
||
{{out}} |
{{out}} |
Revision as of 11:20, 28 August 2022
Create a program, which prints its source code to the stdout!
- Related tasks
11l
:start:
-V sourceFileName = fs:path:split_ext(:argv[0])[0]‘.11l’
print(File(sourceFileName).read())
Batch File
@echo off
for /f "tokens=*" %%s in (%~n0%~x0) do (echo %%s)
FreeBASIC
This works for Linux.
shell( "cat quine.bas" )
Furor
1 argv getfile dup sprint free
end
Go
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"path"
)
func main() {
self := path.Base(os.Args[0]) + ".go"
bytes, err := ioutil.ReadFile(self)
if err != nil {
log.Fatal(err)
}
fmt.Print(string(bytes))
}
- Output:
Just the invoking line as remainder is, of course, as above.
$ go run self_print.go
jq
Works with gojq, the Go implementation of jq
A jq program that contains any JSON entity formatted as though by jq will print itself. The shortest such program would be a single digit, e.g.:
0
- Output:
Example invocation: jq -n 0
0
Julia
The running program's filename is referenced as the builtin PROGRAM_FILE variable in Julia.
""" Read the program file and print it. """
printitself() = print(read(PROGRAM_FILE, String))
printitself()
Ksh
#!/bin/ksh
# Program to print it's own source code
######
# main #
######
while read line; do
print "${line}"
done < $0
Lua
-- arg[0] contains the name of the invoked script.
print(io.open(arg[0]):read"*a")
Nanoquery
println new(Nanoquery.IO.File).open(args[1]).readAll()
Nim
We suppose that the source file is in the same directory as the executable file.
import os
let execFile = getAppFilename()
let sourceFile = execFile.addFileExt("nim")
stdout.write sourceFile.readFile()
Perl
# 20201011 added Perl programming solution
use strict;
use warnings;
open my $in, '<', $0 or die;
print while <$in>;
close($in)
# @ARGV=$0; print <> # slurp without an explicit open()
Phix
Interpreted only:
puts(1,get_text(command_line()[2]))
- Output:
puts(1,get_text(command_line()[2]))
Interpreted or compiled - latter only works while executable and source are still in the same directory, and not renamed.
puts(1,get_text(substitute(command_line()[2],".exe",".exw")))
- Output:
>p test ;; or p -c test puts(1,get_text(substitute(command_line()[2],".exe",".exw")))
Alternative - see the docs (ie phix.chm) for an explanation of the ("") and [1][2]:
?get_text(include_path("")&include_files()[1][2])
- Output:
"?get_text(include_path("")&include_files()[1][2])"
PowerShell
Write-Host $MyInvocation.MyCommand
Python
import sys
with open(sys.argv[0],'r') as input:
for row in input:
print(row, end='')
Raku
Not really sure what the point of this task is.
Is it supposed to be a quine?
my &f = {say $^s, $^s.raku;}; f "my \&f = \{say \$^s, \$^s.raku;}; f "
Or just a program that when executed echoes its source to STDOUT? (Here's probably the simplest valid program that when executed, echoes its source to STDOUT. It is exceptionally short: zero bytes; and when executed echoes zero bytes to STDOUT.)
Or are we supposed to demonstrate how to locate the currently executing source code file and incidentally, print it.
print $*PROGRAM.slurp
Whatever. Any of these satisfy the rather vague specifications.
REXX
/*REXX program prints its own multi─line source to the standard output (stdout). */
do j=1 for sourceline()
call lineout , sourceline(j)
end /*j*/ /*stick a fork in it, we're all done. */
Ring
fileName = filename()
fp = fopen(fileName,"r")
? read(filename())
fclose(fp)
- Output:
fileName = filename() fp = fopen(fileName,"r") ? read(filename()) fclose(fp)
Wren
import "os" for Process
import "io" for File
var args = Process.allArguments
System.write(File.read(args[1]))
- Output:
Just the invoking line as remainder is, of course, as above.
$ wren self_print.wren
Z80 Assembly
This program prints its bytecode as text to the Amstrad CPC terminal. The program is run by typing call &1000
to the screen.
WinAPE Z80 Assembler V1.0.13 000001 0000 (1001) org &1001 000003 1001 21 01 10 ld hl,&1001 000004 1004 1E FF ld e,&ff ;0 is the terminator so we can't use zero as an immediate directly 000005 1006 1C inc e ;we have to abuse 8-bit underflow to get it. 000006 1007 loop 000007 1007 7E ld a,(hl) 000008 1008 BB cp e 000009 1009 CA 2B 10 jp z,ProgramEnd 000011 100C CD 36 10 call UnpackNibbles 000012 100F 78 ld a,b 000013 1010 FE 0A cp &0A 000014 1012 38 02 jr c,noCorrectHex_B 000015 1014 C6 07 add &07 000016 1016 noCorrectHex_B 000017 1016 C6 30 add &30 000018 1018 CD 5A BB call &bb5a 000020 101B 79 ld a,c 000021 101C FE 0A cp &0A 000022 101E 38 02 jr c,noCorrectHex_C 000023 1020 C6 07 add &07 000024 1022 noCorrectHex_C 000025 1022 C6 30 add &30 000026 1024 CD 5A BB call &bb5a 000027 1027 23 inc hl 000028 1028 C3 07 10 jp loop 000029 102B ProgramEnd 000030 102B 3E 30 ld a,&30 000031 102D CD 5A BB call &bb5a 000032 1030 3E 30 ld a,&30 000033 1032 CD 5A BB call &bb5a 000034 1035 C9 ret ;return to basic 000037 1036 UnpackNibbles 000038 1036 ;splits a into its component nibbles, storing high nibble in B and low in C. 000039 1036 F5 push af 000040 1037 E6 0F and &0f 000041 1039 4F ld c,a 000042 103A F1 pop af 000043 103B E6 F0 and &f0 000044 103D 0F rrca 000045 103E 0F rrca 000046 103F 0F rrca 000047 1040 0F rrca 000048 1041 47 ld b,a 000049 1042 C9 ret 000051 1043 00 db 0 ;this must be the only instance of 00 in the bytecode for this to work.
- Output: