Print itself

From Rosetta Code
Revision as of 16:36, 13 October 2020 by Hkdtam (talk | contribs) (→‎{{header|Perl}}: shorter alternative)
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


Batch File

<lang dos> @echo off for /f "tokens=*" %%s in (%~n0%~x0) do (echo %%s) </lang>

Furor

<lang Furor> 1 argv getfile dup sprint free end </lang>

Go

<lang 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))

}</lang>

Output:

Just the invoking line as remainder is, of course, as above.

$ go run self_print.go

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. """ printitself() = print(read(PROGRAM_FILE, String))

printitself() </lang>

Perl

<lang Perl># 20201011 added Perl programming solution

use strict; use warnings;

open my $in, '<', $0 or die; print while <$in>; close($in)

  1. @ARGV=$0; print <> # slurp without an explicit open()</lang>

Phix

Interpreted only: <lang Phix>puts(1,get_text(command_line()[2]))</lang>

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. <lang Phix>puts(1,get_text(substitute(command_line()[2],".exe",".exw")))</lang>

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]: <lang Phix>?get_text(include_path("")&include_files()[1][2])</lang>

Output:
"?get_text(include_path("")&include_files()[1][2])"

PowerShell

<lang PowerShell> Write-Host $MyInvocation.MyCommand </lang>

Raku

Works with: Rakudo version 2020.05

Not really sure what the point of this task is.

Is it supposed to be a quine? <lang perl6>my &f = {say $^s, $^s.raku;}; f "my \&f = \{say \$^s, \$^s.raku;}; f " </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.)

<lang perl6></lang>

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>

Whatever. Any of these satisfy the rather vague specifications.

REXX

<lang 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. */</lang>

Ring

<lang ring> fileName = filename() fp = fopen(fileName,"r") ? read(filename()) fclose(fp) </lang>

Output:
fileName = filename()
fp = fopen(fileName,"r")
? read(filename())
fclose(fp)

Wren

<lang ecmascript>import "os" for Process import "io" for File

var args = Process.allArguments System.write(File.read(args[1]))</lang>

Output:

Just the invoking line as remainder is, of course, as above.

$ wren self_print.wren