Print itself: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added Lua.)
m (syntax highlighting fixup automation)
Line 9: Line 9:
{{omit from|Delphi}}
{{omit from|Delphi}}
=={{header|11l}}==
=={{header|11l}}==
<lang 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}}==
<lang dos>
<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.
<lang freebasic>shell( "cat quine.bas" )</lang>
<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}}==
<lang go>package main
<syntaxhighlight lang="go">package main


import (
import (
Line 49: Line 49:
}
}
fmt.Print(string(bytes))
fmt.Print(string(bytes))
}</lang>
}</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 jq>0</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.
<lang julia>""" Read the program file and print it. """
<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}}==
<lang ksh>#!/bin/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</lang>
done < $0</syntaxhighlight>


=={{header|Lua}}==
=={{header|Lua}}==


<lang Lua>-- arg[0] contains the name of the invoked script.
<syntaxhighlight lang="lua">-- arg[0] contains the name of the invoked script.
print(io.open(arg[0]):read"*a")</lang>
print(io.open(arg[0]):read"*a")</syntaxhighlight>


=={{header|Nanoquery}}==
=={{header|Nanoquery}}==
<lang Nanoquery>println new(Nanoquery.IO.File).open(args[1]).readAll()</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.
<lang Nim>import os
<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()</lang>
stdout.write sourceFile.readFile()</syntaxhighlight>


=={{header|Perl}}==
=={{header|Perl}}==
<lang Perl># 20201011 added Perl programming solution
<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()</lang>
# @ARGV=$0; print <> # slurp without an explicit open()</syntaxhighlight>


=={{header|Phix}}==
=={{header|Phix}}==
Interpreted only:
Interpreted only:
<lang Phix>puts(1,get_text(command_line()[2]))</lang>
<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.
<lang Phix>puts(1,get_text(substitute(command_line()[2],".exe",".exw")))</lang>
<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]:
<lang Phix>?get_text(include_path("")&include_files()[1][2])</lang>
<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}}
<lang python>import sys
<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='')</lang>
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 perl6>my &f = {say $^s, $^s.raku;}; f "my \&f = \{say \$^s, \$^s.raku;}; f "
<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 perl6>print $*PROGRAM.slurp</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}}==
<lang rexx>/*REXX program prints its own multi─line source to the standard output (stdout). */
<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. */</lang><br><br>
end /*j*/ /*stick a fork in it, we're all done. */</syntaxhighlight><br><br>


=={{header|Ring}}==
=={{header|Ring}}==
<lang 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}}==
<lang ecmascript>import "os" for Process
<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]))</lang>
System.write(File.read(args[1]))</syntaxhighlight>


{{out}}
{{out}}

Revision as of 11:20, 28 August 2022

Print itself is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

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: 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

Works with: python3
import sys
with open(sys.argv[0],'r') as input:
    for row in input:
        print(row, end='')

Raku

Works with: Rakudo version 2020.05

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:

Output on WinAPE