Native shebang: Difference between revisions
Content added Content deleted
Drkameleon (talk | contribs) (added Arturo implementation) |
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
||
Line 55:
Also note that this ".so" will only be generated if the ".a68" source file
has been touched.
'''File: echo.a68'''<
# -*- coding: utf-8 -*- #
STRING ofs := "";
FOR i FROM 4 TO argc DO print((ofs, argv(i))); ofs:=" " OD</
'''Test Execution:'''
<pre>
Line 71:
=={{header|Arturo}}==
Arturo is a scripting language and does not compile to a binary.
<
print "Hello from Arturo!"</
{{out}}
Line 86:
'''File: script_gcc.c'''
<
/* Optional: this C code initially is-being/can-be boot strapped (compiled) using bash script_gcc.sh */
#include <errno.h>
Line 210:
perror(STRCAT(binpath, ": executable not available", ENDCAT));
exit(errno);
}</
'''Test Source File: echo.c'''
<
#include <stdio.h>
#include <string.h>
Line 226:
putchar('\n');
exit(EXIT_SUCCESS);
}</
'''Test Execution:'''
Line 239:
===2nd version. Pure C, no extra bash script===
'''File: script_gcc.c'''
<
* rosettacode.org: Native shebang
*
Line 410:
return !fprintf(stderr, "%s : executable not available\n", exec_path) | ENOENT;
}
</syntaxhighlight>
'''Test Source File: echo.c'''
<
/*
* note, any additional libs or include paths would have params added after
Line 431:
putchar('\n');
exit(EXIT_SUCCESS);
}</
'''Test Execution:'''
Line 444:
=={{header|Forth}}==
Such functionality can be added easily by the following definition:
<syntaxhighlight lang="text">: #! [COMPILE] \ ; immediate</
Some Forth compilers - like 4tH or Gforth - support this functionality out of the box.
This example program works as advertised:
<syntaxhighlight lang="text">#! /usr/local/bin/4th cxq
argn 1 ?do i args type space loop cr</
=={{header|Free Pascal}}==
Line 464:
The following works fine on Ubuntu 16.04.
<
package main
Line 476:
fmt.Println(os.Args[1])
}
}</
{{out}}
Line 487:
As no compiling versions of J are currently available, the binaries are trivially empty and we shall store them in the empty path. We shall use /usr/local/bin/ijconsole (which was compiled using a C compiler) as the J interpreter, and <code>echo each ARGV</code> as our sample code:
<
echo each ARGV</
=={{header|jq}}==
Line 502:
'''Example 1:'''
<
#!/usr/bin/env/jq -M -n -r -f
"Klaatu barada nikto!"</
Line 518:
'''Example 2:'''
<
#!/usr/bin/env/jq -M -n -r -f
$x</
{{out}}
<
Hello, world!</
=={{header|Julia}}==
usage: ./thisfile.jl "hello"
<
# Put the Julia code below this line. It will be compiled and run.
Line 534:
println(ARGS)
</
<pre>
_
Line 551:
'''File: echo.langur'''
<
writeln join " ", _args</
'''Usage:'''
Line 568:
'''File: nativeshebang.nim'''
<
import os,strutils
echo commandLineParams().join(" ")</
'''Usage:'''
<pre>./nativeshebang.nim hello, world</pre>
Line 579:
'''File: nim.cfg'''
<syntaxhighlight lang
'''File: nativeshebang2.nims'''
<
import os,strutils
echo commandLineParams().join(" ")</
'''Usage:'''
<pre>./nativeshebang2.nim hello, world</pre>
Line 593:
'''File: echo.ml'''
<
let () =
let argl = Array.to_list Sys.argv in
print_endline (String.concat " " (List.tl argl))</
{{out}}
<pre>
Line 615:
'''File: echo.pl'''
<
print "@ARGV\n";
</syntaxhighlight>
'''Usage:'''
Line 633:
and compilation, apart from the executable file, is a -c flag on the command line, which I recommend
omitting unless it proves helpful or necessary. Example (quietly ignored by pwa/p2js, and Phix in general):
<
You can also invoke the compiler directly as follows
<!--<
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- (system_exec)</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">sourcefile</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"test.exw"</span><span style="color: #0000FF;">,</span>
Line 641:
<span style="color: #000000;">cmd</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%s %s"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">interpreter</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sourcefile</span><span style="color: #0000FF;">})</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">system_exec</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cmd</span><span style="color: #0000FF;">)</span>
<!--</
See also demo/capture_console.exw which redirects stdin/out/err while interpreting a child process.
Line 652:
'''File: echo.py'''
<
# Although `#!/usr/bin/env python` may be better if the path to python can change
import sys
print " ".join(sys.argv[1:])</
'''Usage:'''
Line 682:
File <tt>native-shebang.rkt</tt> contains the following:
<
#lang racket
(displayln "hello")</
My directory contains only this:
Line 718:
'''File: echo.p6'''
<syntaxhighlight lang="raku"
put @*ARGS;</
'''Usage:'''
Line 733:
===Unix shebang===
Using e.g. Regina open source REXX interpreter
<
#!/usr/local/bin/regina
/* Echo the command line argument */
say arg(1)
</syntaxhighlight>
===ARexx===
Under AmigaOS, the obligatory REXX starting comment /* is recognised as a shebang of its own, automatically causing the file to be parsed by ARexx as long as the file's script flag is set.
<
/* Echo the command line argument */
say arg(1)
</syntaxhighlight>
=={{header|Ruby}}==
Line 751:
=={{header|Sidef}}==
Sidef is a scripting language and does not compile to a binary.
<
say ARGV.join(" ")</
{{out}}
Line 764:
'''File: echo.swift'''
<
import Foundation
print(Process.arguments[1..<Process.arguments.count].joinWithSeparator(" "))
</syntaxhighlight>
'''Usage:'''
<
./echo.swift Hello, world!
</syntaxhighlight>
{{Out}}
Line 788:
'''File: echo.sh'''
<
echo "$@"</
'''Usage:'''
Line 806:
'''File: script_gcc.sh'''
<
# Actual shebang when using bash:
Line 869:
echo "$binpath: executable not available" 1>&2
exit $ENOENT
fi</
'''Test Source File: echo.c'''
<
#include <stdio.h>
#include <string.h>
Line 884:
putchar('\n');
exit(EXIT_SUCCESS);
}</
'''Test Execution:'''
Line 897:
=={{header|Wren}}==
Normally, Process.arguments[0] would return the (first) command line argument but here we need to use Process.arguments[1] because the first argument passed to Wren's command line interpreter is ''./native_shebang.wren''.
<
import "os" for Process
System.print(Process.arguments[1])</
{{out}}
Line 912:
Since the #! parsing is done by a compiler front end and was designed to be used from the command line, we'll do that by forking zkl to compile the source if it is newer than the binary.
<
// This file: nativeShebang.zkl, compiles to nativeShebang.zsc
// zkl --#! . -c nativeShebang -o.
Line 932:
////////////// the script:
println("Hello world!");</
{{out}}
<pre>
|