Ini adalah perintah eskrip yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa workstation online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS
PROGRAM:
NAMA
escript - Dukungan skrip Erlang
DESKRIPSI
naskah menyediakan dukungan untuk menjalankan program Erlang pendek tanpa harus mengompilasinya
pertama dan cara mudah untuk mengambil argumen baris perintah.
EKSPOR
nama-skrip skrip-arg1 skrip-arg2...
naskah bendera-eskrip nama-skrip skrip-arg1 skrip-arg2...
naskah menjalankan skrip yang ditulis dalam Erlang.
Berikut ini sebuah contoh.
$ chmod u+x faktorial
$ faktorial kucing
#!/usr/bin/env naskah
%% -*- erlang -*-
%%! -smp aktifkan -nama faktorial -mnesia debug verbose
utama([String]) ->
mencoba
N = daftar_ke_integer(String),
F = fakta(N),
io:format("faktorial ~w = ~w\n", [N,F])
menangkap
_:_ ->
penggunaan()
akhir;
utama(_) ->
penggunaan().
penggunaan() ->
io:format("penggunaan: bilangan bulat faktorial\n"),
berhenti(1).
fac(0) -> 1;
fac(N) -> N * fac(N-1).
$ ./faktorial 5
faktorial 5 = 120
$ ./faktorial
penggunaan: bilangan bulat faktorial
$ ./faktorial lima
penggunaan: bilangan bulat faktorial
Header skrip Erlang dalam contoh berbeda dari modul Erlang biasa.
Baris pertama dimaksudkan sebagai baris juru bahasa, yang memanggil naskah.
Namun jika Anda memanggil naskah begini
$ eskrip faktorial 5
isi baris pertama tidak masalah, tetapi tidak boleh berisi kode Erlang
karena akan diabaikan.
Baris kedua dalam contoh, berisi arahan opsional ke Emacs editor
yang menyebabkannya masuk ke mode utama untuk mengedit file sumber Erlang. jika
direktif hadir itu harus ditempatkan di baris kedua.
Jika ada komentar pilih encoding itu dapat terletak di baris kedua.
Catatan:
Pengkodean yang ditentukan oleh komentar yang disebutkan di atas berlaku untuk skrip itu sendiri.
Pengkodean server I/O, bagaimanapun, harus diatur secara eksplisit seperti ini:
io:setopts([{pengkodean, unicode}])
Encoding default dari I/O-server untuk standar_io is latin1 sejak naskah
berjalan di terminal non-interaktif (lihat Menggunakan Unicode in erlang).
Pada baris ketiga (atau baris kedua tergantung pada keberadaan Emacs
direktif), dimungkinkan untuk memberikan argumen ke emulator, seperti
%%! -smp aktifkan -nama faktorial -mnesia debug verbose
Baris argumen seperti itu harus dimulai dengan %%! dan sisa baris akan ditafsirkan
sebagai argumen untuk emulator.
Jika Anda tahu lokasi naskah dapat dieksekusi, baris pertama dapat langsung
memberikan jalan untuk naskah. Contohnya:
#!/usr/local/bin/eskrip
Seperti jenis skrip lainnya, skrip Erlang tidak akan berfungsi pada platform Unix jika:
bit eksekusi untuk file skrip tidak disetel. (Menggunakan chmod +x nama-skrip untuk menyalakan
bit eksekusi.)
Sisa file skrip Erlang mungkin berisi Erlang sumber kode, Sebuah
sebaris balok fillet atau sebaris arsip fillet.
File skrip Erlang harus selalu berisi fungsi utama/1. Saat naskahnya
lari, itu utama/1 fungsi akan dipanggil dengan daftar string yang mewakili
argumen yang diberikan ke skrip (tidak diubah atau ditafsirkan dengan cara apa pun).
Jika utama/1 fungsi dalam skrip berhasil kembali, status keluar untuk
skrip akan menjadi 0. Jika pengecualian dihasilkan selama eksekusi, pesan singkat
akan dicetak dan skrip dihentikan dengan status keluar 127.
Untuk mengembalikan kode keluar bukan nol Anda sendiri, hubungi berhenti (Kode Keluar); contohnya:
berhenti(1).
Memanggil eskrip:nama_script() dari skrip to Anda untuk mengambil nama path dari
skrip (nama path biasanya, tetapi tidak selalu, absolut).
Jika file tersebut berisi kode sumber (seperti pada contoh di atas), maka akan diproses oleh
praprosesor ePP. Ini berarti bahwa Anda misalnya dapat menggunakan makro yang telah ditentukan sebelumnya
(Seperti ?MODUL) serta menyertakan arahan seperti -termasuk_lib Directive.
Misalnya, gunakan
-include_lib("kernel/include/file.hrl").
untuk memasukkan definisi rekaman untuk rekaman yang digunakan oleh file: read_link_info/1
fungsi. Anda juga dapat memilih penyandian dengan menyertakan komentar penyandian di sini, tetapi jika
ada komentar pengkodean yang valid pada baris kedua yang diutamakan.
Skrip akan diperiksa kebenaran sintaksis dan semantiknya sebelum dijalankan.
Jika ada peringatan (seperti variabel yang tidak digunakan), mereka akan dicetak dan
skrip akan tetap dijalankan. Jika ada kesalahan, mereka akan dicetak dan skrip
tidak akan dijalankan dan status keluarnya akan menjadi 127.
Baik deklarasi modul dan deklarasi ekspor dari utama/1 fungsinya adalah
opsional.
Secara default, skrip akan ditafsirkan. Anda dapat memaksanya untuk dikompilasi oleh
termasuk baris berikut di suatu tempat di file skrip:
-mode (kompilasi).
Eksekusi kode yang ditafsirkan lebih lambat dari kode yang dikompilasi. Jika banyak dari
eksekusi terjadi dalam kode yang ditafsirkan, mungkin bermanfaat untuk mengompilasinya, bahkan
meskipun kompilasi itu sendiri akan memakan waktu agak lama. Bisa juga
menyediakan asli alih-alih menyusun, ini akan mengkompilasi skrip menggunakan yang asli
bendera, sekali lagi tergantung pada karakteristik eskrip ini bisa atau tidak bisa
bernilai sementara.
Seperti disebutkan sebelumnya, dimungkinkan untuk memiliki skrip yang berisi prakompilasi
balok kode. Dalam skrip yang telah dikompilasi, interpretasi dari header skrip adalah
persis sama seperti dalam skrip yang berisi kode sumber. Itu artinya kamu bisa
membuat balok file yang dapat dieksekusi dengan menambahkan file dengan baris yang dimulai dengan #!
dan %%! disebutkan di atas. Dalam skrip yang telah dikompilasi, fungsinya utama/1 harus
diekspor.
Sebagai opsi lain, dimungkinkan untuk memiliki seluruh arsip Erlang di
naskah. Dalam skrip arsip, interpretasi tajuk skrip persis seperti
sama seperti dalam skrip yang berisi kode sumber. Itu berarti Anda dapat membuat arsip
file yang dapat dieksekusi dengan menambahkan file dengan baris yang dimulai dengan #! dan %%!
disebutkan di atas. Dalam skrip arsip, fungsinya utama/1 harus diekspor. Oleh
default utama/1 fungsi dalam modul dengan nama yang sama dengan nama dasar dari
naskah file akan dipanggil. Perilaku ini dapat ditimpa dengan menyetel tanda
-eskrip utama Modul sebagai salah satu flag emulator. NS Modul harus nama a
modul yang telah diekspor utama/1 fungsi. Lihat kode(3erl) untuk informasi lebih lanjut
tentang arsip dan pemuatan kode.
Dalam banyak kasus, sangat nyaman untuk memiliki header di eskrip, terutama di
Platform Unix. Tapi header sebenarnya opsional. Ini berarti Anda secara langsung
dapat "mengeksekusi" modul Erlang, berkas berkas, atau berkas arsip tanpa menambahkan header apa pun
ke mereka. Tetapi kemudian Anda harus menjalankan skrip seperti ini:
$escript factorial.erl 5
faktorial 5 = 120
$ eskrip faktorial.beam 5
faktorial 5 = 120
$ eskrip faktorial.zip 5
faktorial 5 = 120
eskrip: buat (FileOrBin, Bagian) -> ok | {oke, biner()} | {kesalahan, ketentuan()}
jenis:
FileOrBin = nama file() | 'biner'
Bagian = [Header] Isi | Tubuh
Tajuk = Shebang | {shebang, Shebang} | komentar | {komentar, Komentar} |
{emu_args, EmuArgs}
Shebang = string() | 'default' | 'tidak terdefinisi'
Komentar = string() | 'default' | 'tidak terdefinisi'
EmuArgs = string() | 'tidak terdefinisi'
Isi = {sumber, SourceCode} | {beam, BeamCode} | {arsip, ZipArchive} |
{arsip, ZipFiles, ZipOptions}
SourceCode = BeamCode = file:namafile() | biner()
Arsip Zip = zip:namafile() | biner()
ZipFile = [ZipFile]
ZipFile = file:namafile() | {file:namafile(), biner()} | {file:namafile(),
biner(), file:file_info()}
Opsi Zip = [zip:buat_opsi()]
buat/2 function membuat eskrip dari daftar bagian. Bagian dapat
diberikan dalam urutan apapun. Sebuah eskrip dimulai dengan opsional Header diikuti dengan
wajib Body. Jika tajuk ada, itu selalu dimulai dengan a peristiwa,
mungkin diikuti oleh komentar dan emu_args. itu peristiwa default ke "/usr/bin/env
naskah". Komentar default ke "Ini is an - * - diperoleh - * - mengajukan". yang diciptakan
escript dapat dikembalikan sebagai biner atau ditulis ke file.
Sebagai contoh bagaimana fungsi dapat digunakan, kami membuat eskrip yang ditafsirkan
yang menggunakan emu_args untuk mengatur beberapa flag emulator. Dalam hal ini terjadi untuk menonaktifkan
smp_support. Kami juga mengekstrak bagian yang berbeda dari yang baru dibuat
naskah:
> Sumber = "%% Demo\nmain(_Args) ->\n io:format(erlang:system_info(smp_support)).\n".
"%% Demo\nmain(_Args) ->\n io:format(erlang:system_info(smp_support)).\n"
> io:format("~s\n", [Sumber]).
%% Demo
utama(_Args) ->
io:format(erlang:system_info(smp_support)).
ok
> {ok, Bin} = escript:create(binary, [shebang, comment, {emu_args, "-smp disable"}, {source, list_to_binary(Source)}]).
{baik,<<"#!/usr/bin/env escript\n%% Ini adalah -*- erlang -*- file\n%%!-smp disabl"...>>}
> file:write_file("demo.escript", Bin).
ok
> os:cmd("escript demo.escript").
"Salah"
> escript:extract("demo.escript", []).
{ok,[{shebang,default}, {comment,default}, {emu_args,"-smp disable"},
{sumber,<<"%% Demo\nmain(_Args) ->\n io:format(erlang:system_info(smp_su"...>>}]}
Escript tanpa header dapat dibuat seperti ini:
> file:write_file("demo.erl", ["%% demo.erl\n-module(demo).\n-ekspor([main/1]).\n\n", Sumber]).
ok
> {ok, _, BeamCode} = compile:file("demo.erl", [binary, debug_info]).
{oke, demo,
<<70,79,82,49,0,0,2,208,66,69,65,77,65,116,111,109,0,0,0,
79,0,0,0,9,4,100,...>>}
> escript:create("demo.beam", [{beam, BeamCode}]).
ok
> escript:extract("demo.beam", []).
{ok,[{shebang,undefined}, {komentar,undefined}, {emu_args,undefined},
{balok,<<70,79,82,49,0,0,3,68,66,69,65,77,65,116,
111,109,0,0,0,83,0,0,0,9,...>>}]}
> os:cmd("eskrip demo.beam").
"Benar"
Di sini kami membuat skrip arsip yang berisi kode Erlang dan juga kode balok.
Kemudian kami mengulangi semua file dalam arsip dan mengumpulkan kontennya dan beberapa
info tentang mereka.
> {ok, SourceCode} = file:read_file("demo.erl").
{ok,<<"%% demo.erl\n-module(demo).\n-ekspor([main/1]).\n\n%% Demo\nmain(_Arg"...>>}
> escript:create("demo.escript", [shebang, {arsip, [{"demo.erl", SourceCode}, {"demo.beam", BeamCode}], []}]).
ok
> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined}, {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
{ok,[{shebang,default}, {komentar,undefined}, {emu_args,undefined},
{{arsip,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
152,61,93,107,0,0,0,118,0,...>>}]}
> file:write_file("demo.zip", ArchiveBin).
ok
> zip:foldl(fun(N, I, B, A) -> [{N, I(), B()} | A] end, [], "demo.zip").
{oke,[{"demo.beam",
{file_info,748,reguler,baca_tulis,
{{2010,3,2},{0,59,22}},
{{2010,3,2},{0,59,22}},
{{2010,3,2},{0,59,22}},
54,1,0,0,0,0,0},
<<70,79,82,49,0,0,2,228,66,69,65,77,65,116,111,109,0,0,0,
83,0,0,...>>},
{"demo.erl",
{file_info,118,reguler,baca_tulis,
{{2010,3,2},{0,59,22}},
{{2010,3,2},{0,59,22}},
{{2010,3,2},{0,59,22}},
54,1,0,0,0,0,0},
<<"%% demo.erl\n-module(demo).\n-ekspor([main/1]).\n\n%% Demo\nmain(_Arg"...>>}]}
eskrip:ekstrak(File, Pilihan) -> {oke, Bagian} | {kesalahan, ketentuan()}
jenis:
File = nama file()
Opsi = [] | [kompilasi_sumber]
Bagian = Isi Header
Header = {shebang, Shebang} {komentar, Komentar} {emu_args, EmuArgs}
Shebang = string() | 'default' | 'tidak terdefinisi'
Komentar = string() | 'default' | 'tidak terdefinisi'
EmuArgs = string() | 'tidak terdefinisi'
Isi = {sumber, SourceCode} | {sumber, BeamCode} | {beam, BeamCode} | {Arsip,
Arsip Zip}
SourceCode = BeamCode = ZipArchive = biner()
ekstrak/2 fungsi mem-parsing eskrip dan mengekstrak bagian-bagiannya. Ini adalah
kebalikan dari buat/2.
Semua bagian dikembalikan meskipun tidak ada dalam eskrip. Jika tertentu
bagian kebetulan memiliki nilai yang sama dengan nilai default, nilai yang diekstraksi adalah
diatur ke atom kegagalan. Jika bagian tidak ada, nilai yang diekstraksi diatur ke
atom tidak terdefinisi.
kompilasi_sumber opsi hanya memengaruhi hasil jika skrip berisi sumber
kode. Dalam hal ini kode Erlang secara otomatis dikompilasi dan {sumber, Kode Sinar}
dikembalikan sebagai ganti {sumber, Kode sumber}.
> escript:create("demo.escript", [shebang, {arsip, [{"demo.erl", SourceCode}, {"demo.beam", BeamCode}], []}]).
ok
> {ok, [{shebang,default}, {comment,undefined}, {emu_args,undefined}, {archive, ArchiveBin}]} = escript:extract("demo.escript", []).
{ok,[{{arsip,<<80,75,3,4,20,0,0,0,8,0,118,7,98,60,105,
152,61,93,107,0,0,0,118,0,...>>}
{emu_args,tidak ditentukan}]}
eskrip:nama_script() -> File
jenis:
File = nama file()
skrip_nama/0 fungsi mengembalikan nama eskrip yang sedang dieksekusi. jika
fungsi dipanggil di luar konteks eskrip, perilaku tidak terdefinisi.
PILIHAN DITERIMA BY ESKRIP
-C:
Kompilasi eskrip terlepas dari nilai atribut mode.
-d:
Debug skrip. Memulai debugger, memuat modul yang berisi utama/1
berfungsi ke dalam debugger, menyetel breakpoint di utama/1 dan memanggil utama/1. Jika
modul dikompilasi sebelumnya, itu harus dikompilasi secara eksplisit dengan debug_info .
-saya:
Menafsirkan eskrip terlepas dari nilai atribut mode.
-S:
Hanya lakukan pemeriksaan sintaksis dan semantik dari file skrip. Peringatan dan kesalahan
(jika ada) ditulis ke output standar, tetapi skrip tidak akan dijalankan. Keluar
status akan menjadi 0 jika tidak ada kesalahan, dan 127 sebaliknya.
-N:
Kompilasi eskrip menggunakan flag +native.
Gunakan escript online menggunakan layanan onworks.net