Apakah spasi putih dalam pengidentifikasi pernah idiomatik? [Tutup]


43

Gaya C # menyarankan penggunaan CamelCase dalam pengidentifikasi untuk membatasi kata-kata. Cadel tradisi menyarankan menggunakan-strip-gantinya.

Apakah pernah ada bahasa pemrograman di mana menggunakan spasi di pengidentifikasi tidak hanya diizinkan, tetapi idiom yang umum digunakan ketika menggunakan pengidentifikasi multi-kata?

Dimungkinkan untuk memiliki pengidentifikasi dengan spasi di beberapa implementasi Skema , tetapi itu bukan praktik yang banyak dilihat. Ini sebuah contoh:

Petite Chez Scheme Version 8.4
Copyright (c) 1985-2011 Cadence Research Systems

> (define |hey there| 100)
> (define |x y z| 200)
> (list |hey there| |x y z|)
(100 200)

Jika Anda memiliki ruang nama, itu adalah bentuk pengidentifikasi majemuk. Misalnya C ++: bobs_utilities :: string_functions :: scramble. Ini adalah nama, dan kami dapat menyertakan spasi putih sewenang-wenang jika kami mau karena itu sintaks, bukan token yang sederhana. Nama dengan banyak komponen ingin menjadi sintaksis abstrak; Memilih info namespace menjadi pengidentifikasi tunggal pada dasarnya adalah peretas "name mangling" untuk merepresentasikan struktur di dalam teks di mana Anda tidak memiliki mekanisme untuk merepresentasikan struktur.
Kaz

Cukup umum di JS, yang penulis utamanya adalah seorang pria Skema.
Erik Reppen

1
@ErikReppen Sejauh yang saya tahu, spasi tidak valid sebagai bagian dari pengidentifikasi javascript ...
Izkata

Bukan untuk vars no. Untuk nama properti, kita dapat menggunakan string apa pun dalam tanda kurung. mis. alert({'some Prop':'bob'}['some Prop']);tetapi jika nama-nama properti string gagal tes pengidentifikasi / label Anda tidak dapat menggunakannya dengan notasi titik.
Erik Reppen

Di Ruby Anda dapat: define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;dan kemudian Anda dapat: send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"tetapi itu tidak umum.
Darek Nędza

Jawaban:


66

Kompiler FORTRAN mengabaikan ruang jadi:

   result = value * factor  
   r e s u l t = val ue * fac tor
   result=value*factor`

Itu identik sejauh menyangkut kompiler.

Beberapa dialek SQL memungkinkan ruang yang disematkan dalam nama kolom tetapi mereka harus dikelilingi oleh backquotes atau pembatas lain sebelum dapat digunakan.


7
+1, ini baru bagi saya. Saya selalu bertanya-tanya mengapa saya hanya mendapat nilai B di Fortran tetapi sekarang saya tahu :)
NoChance

20
Manual Sun FORTRAN digunakan untuk memasukkan kalimat ini: "Secara konsisten memisahkan kata-kata dengan spasi menjadi kebiasaan umum tentang abad kesepuluh, dan berlangsung hingga sekitar tahun 1957, ketika FORTRAN meninggalkan praktik itu."
Blrfl

26

Visual Basic (dan VBScript) juga memungkinkan spasi putih di pengidentifikasi jika Anda mengelilingi pengenal dengan tanda kurung siku.

Dim [Hello World]
[Hello World] = 123

Namun, melakukannya sangat jarang.


13

Apakah SQL dihitung?

create table "Registered Members" (
    "Full Name" varchar(100),
    "Mailing Address" varchar(100),
    etc...
);

3
Itu memang mungkin, tetapi saya tidak akan menyebutnya idiomatik.
Joachim Sauer

3
Jika Anda perlu topeng, sepertinya tidak dianjurkan.
pengguna tidak diketahui

11

Well Whitespace adalah tentang ... whitespace:

Kebanyakan bahasa pemrograman modern tidak menganggap sintaksis spasi putih (spasi, tab dan baris baru), mengabaikannya, seolah-olah mereka tidak ada di sana. Kami menganggap ini sebagai ketidakadilan yang luar biasa bagi anggota set karakter yang sangat ramah ini. Haruskah mereka diabaikan, hanya karena mereka tidak terlihat? Whitespace adalah bahasa yang berupaya memperbaiki keseimbangan. Setiap karakter yang bukan spasi putih diabaikan; hanya spasi, tab, dan baris baru yang dianggap sintaks.

Sayangnya Markdown tidak mendukung sintaksnya dan saya tidak dapat menunjukkan beberapa kode kepada Anda, tetapi Wikipedia memiliki sampel kode yang ramah manusia .


@ sepp2k Whitespace memiliki label.
yannis

Oh kamu benar Lupakan saja.
sepp2k

"Sebagian besar bahasa pemrograman modern tidak mempertimbangkan karakter spasi putih". Python tidak :)
jadkik94

@ jadkik94 Python tidak menggunakan spasi, tetapi untuk indentasi bukan sebagai pengidentifikasi.
yannis

@YannisRizos Oh, ya. Dan memang benar bahwa sebagian besar bahasa tidak menggunakan spasi sama sekali (pengidentifikasi atau tidak)
jadkik94

11

Di Algol 68 Anda dapat memiliki ruang dalam pengidentifikasi (saya tidak ingat apakah mereka signifikan atau tidak). Tetapi kata kunci ditandai dengan berhenti . Menggunakan nama dengan spasi di dalamnya adalah idiomatik (setidaknya di sekitar saya).

VHDL memungkinkan melarikan diri pengidentifikasi dengan ruang yang signifikan di dalamnya: \foo bar\. Hal ini memungkinkan juga untuk menggunakan kata kunci sebagai identifier \and\, setiap karakter \n<42>\dan kasus sensitivitas dalam pengidentifikasi ( \Foo\dan \foo\berbeda sementara Foodan foosetara, dan berbeda dari baik \Foo\dan\foo\!). Verilog juga telah menggunakan pengidentifikasi dengan sebagian besar karakteristik ini (pengidentifikasi normal peka terhadap huruf besar dan menghindarinya secara tidak perlu tidak membuat pengenal lain), tetapi tidak memberikan ruang di dalamnya. Kebutuhan dari pengidentifikasi yang lolos dalam VHDL dan Verilog berasal dari fakta bahwa mereka sering diproduksi secara otomatis dari sumber lain (seperti skema) di mana pengidentifikasi biasanya tidak memiliki batasan yang sama seperti dalam bahasa pemrograman; AFAIK, mereka tidak digunakan secara idiomatis dalam situasi lain.


Saya sepertinya ingat (melihat kembali ke tahun 1980-an di sini!) Bahwa CORAL melakukan sesuatu yang serupa - Anda dapat (dan memang) memiliki ruang putih dalam nama variabel, tetapi kata kunci kemudian memiliki tanda kutip di sekitarnya (seperti 'DEFINE'dan, favorit pribadi 'COMMENT',. Kami menggunakan untuk menggunakan prosesor makro untuk menggantinya dengan versi yang tidak dikutip).
AAT

10

Saya tidak tahu apakah Anda menganggap MediaWiki wikitext bahasa, tetapi nama-nama dengan spasi pasti idiomatis:

==Example==
This example lacks text.
{{Expand section}}

Di mana "bentangkan bagian" adalah nama templat (http://en.wikipedia.org/wiki/Template:Expand_section)

Saya kira itu memenuhi kriteria - bahasa di mana pengidentifikasi secara rutin berisi spasi. Ini tidak pernah (saya pikir?) Ambigu karena pengidentifikasi selalu dikelilingi oleh banyak tanda baca untuk memisahkan mereka dari teks wiki mentah.


2
Walaupun wikitext jelas merupakan bahasa formal, saya tidak akan menyebutnya bahasa pemrograman (bahkan tidak memiliki loop).
svick

@svick: Tidak juga Haskell, Smalltalk, Skema, Clojure, Erlang, Lambda Calculus, Mesin Turing, Io, Ioke, Seph,…
Jörg W Mittag

@ JörgWMittag, tetapi mereka memiliki rekursi, yang hanya cara berbeda untuk mengekspresikan loop. Wikitext bahkan tidak memilikinya.
svick

@vick Tergantung pada ekstensi mana yang Anda instal, Anda mendapatkan beberapa struktur kontrol di markup mediawiki. Khususnya Anda mendapatkan ifdan rekursi. Sintaks dan kinerjanya sangat buruk. Templat berperilaku sangat mirip fungsi, dan namanya diperhitungkan sebagai pengidentifikasi dalam buku saya.
CodesInChaos

1
Menarik, dari [[Wikipedia: Transklusi]]: "Tidak ada fungsi perulangan nyata yang dibangun ke dalam perangkat lunak Mediawiki pada saat ini ... tetapi ada beberapa trik untuk meniru mereka. Misalnya, berulang kali memanggil templat yang berulang kali memanggil sebuah template yang berbeda dapat meniru loop ganda. Template juga dapat dipaksa untuk memanggil diri mereka sendiri (biasanya dilarang oleh perangkat lunak Mediawiki melewati satu contoh, untuk mencegah loop tak terbatas), dengan penggunaan pengalihan yang rumit (lihat m: Templat: Loop1 (backlink, sunting)) Lihat juga m: Bantuan: Konversi wikitext secara rekursif. "
Steve Bennett

9

Informasikan 7 adalah sistem untuk mengembangkan fiksi interaktif menggunakan bahasa alami seperti sintaks, di mana multi-kata pengidentifikasi yang biasa:

Mr Jones wears a top hat. The crate contains a croquet mallet. 

Batasannya, tentu saja, adalah pengidentifikasi tidak dapat berisi kata kunci saat ini akan mendua.

Dalam nada yang sama, pengidentifikasi dengan garis bawah di Agda dapat digunakan mixfix, contoh paling sederhana yang mungkin adalah if_then_else_operator:

if_then_else_ : {A : Set} -> Bool -> A -> A -> A
if true  then x else y = x
if false then x else y = y

6

Scala memungkinkan pengidentifikasi sewenang-wenang menggunakan backticks. Penggunaan yang biasa untuk ini adalah memohon Thread.`yield`karena yieldmerupakan kata yang dilindungi undang-undang di Scala. Ini bisa (ab) digunakan untuk memiliki spasi dalam nama, meskipun itu akan jauh dari kode Scala idiomatik:

val `the answer` = 42
println(`the answer`)

Heck, Anda bahkan dapat memiliki tab di pengidentifikasi:

scala> val `the\tanswer` = 42
the     answer: Int = 42

Saya kira ini bisa dibayangkan idiom untuk orang-orang pemrograman yang melek. Mungkin.


Scala memungkinkan karakter seperti +dalam nama metode. Jadi untuk obj.a+=1, itu akan menguraikannya seolah-olah a+=metode. Penemu Martin Odersky dalam buku pelajarannya mengasumsikan bahwa programmer biasanya memasukkan spasi, sehingga ambiguitas parser secara praktis tidak terlalu bermasalah.
Jesvin Jose

1
@aitchnyu: Sebenarnya, dalam pengidentifikasi campuran, bagian alfanumerik dan bagian operator harus dipisahkan oleh garis bawah. obj.a+=1setara dengan obj.a += 1yang setara dengan obj.a.+=(1). Anda perlu memiliki obj.a_+=1jika Anda ingin itu bekerja seperti yang Anda gambarkan. (Sebenarnya, itu akan memberikan kesalahan parse, Anda perlu menelepon obj.a_+=(1)atau obj a_+= 1.)
Jörg W Mittag

Itu bukan tab ... itu stasiun ruang angkasa. Dan dengan stasiun luar angkasa, maksud saya urutan pelarian tab.
Thomas Eding


4

Anda mungkin menganggap hal ini sebagai kasus di Ketimun / Gherkin , di mana nama-nama fungsi secara efektif kalimat dengan argumen yang tertanam di dalamnya.

Sebagai ekstensi, saya berharap ini menjadi lebih umum di DSL kecil , di mana bahasa ini seharusnya ramah untuk non pengembang. Sebagai contoh, banyak mesin aturan menyediakan kemampuan untuk mendefinisikan aturan dengan deskripsi seperti bahasa Inggris, di mana spasi dapat digunakan dalam pengidentifikasi.


3

FWIW, Tcl memungkinkan spasi (dan hampir semua karakter lainnya) dalam pengidentifikasi, meskipun tidak umum untuk memanfaatkan fitur ini. Alasan utama itu tidak sering digunakan adalah hanya karena Anda harus menggunakan kutipan yang tepat. Misalnya, berikut ini menetapkan variabel bernama "nama saya" menjadi "bob", lalu mencetaknya

set "my name" "bob"
puts "hello, ${my name}"

OTOH, ini sangat berguna ketika membangun variabel secara dinamis karena, ketika membuat variabel seperti itu, kita tidak perlu khawatir tentang karakter ilegal



1

Jika Anda menganggap pengujian DSL otomatis bahasa, kerangka robot memungkinkan spasi dalam nama kata kunci, dan itu sangat idiomatis. Dalam contoh berikut "Katakan halo" adalah nama kata kunci, "Contoh kasus uji" adalah nama kasus uji, dan "$ {nama depan}" adalah variabel:

*** Keywords ***
| Say hello | [Arguments] | ${first name}
| | log | Hello, ${first name}

*** Test Cases ***
| Example test case
| | Say hello | world

1

Bahasa 4D memungkinkan ruang putih dalam nama metode dan variabel. Biasanya disukai di dalam komunitas, tetapi semua metode dan variabel bawaan menggunakannya ketika berlaku ( SET MENU ITEM PARAMETER, misalnya)


0

Smalltalk fitur metode kata kunci seperti a:b:c:yang melibatkan spasi ketika dipanggil. Misalnya: a: 100 b: 200 c: 300. Ini adalah ungkapan standar dalam bahasa tersebut.


0

Powershell memungkinkan spasi dalam nama variabel:

PS C:\> ${the var} = 100

PS C:\> ${the var}
100

0

Saya melihat menyebutkan mirip untuk VB tetapi di JS ini banyak digunakan sebenarnya. Setiap properti dari objek dalam JavaScript dapat diakses dan diatur dalam bentuk string dengan tanda kurung siku atau hanya sebagai string dalam literal objek. Nama properti yang tidak mengikuti aturan penamaan variabel JS tidak dapat diakses melalui. notasi tetapi mereka berguna. Misalnya, Anda mungkin ingin memetakan URL ke perilaku atau referensi sekelompok orang dengan nama ketika Anda yakin semuanya unik. Seringkali sangat mudah dan mudah dibaca:

var peoplesFavoriteThings = {
    "Bob Jones":"kittens",
    "Jane Doe":"chainsaws"
}

for(var name in peoplesFavoriteThings){
    console.log(name + ' likes ' + peoplesFavoriteThings[name] + '.\n');
}

Ini juga membuatnya mudah untuk merestrukturisasi JSON untuk kemudahan penggunaan tanpa kehilangan faktor objek instan ketika jatuh ke JS.


Lucu bahwa ini adalah satu-satunya penyebutan JavaScript. Ya, metode dan properti dapat berisi string: foo['my method']()danfoo['my property']
Steve Bennett

0

Power Query menggunakan banyak kode yang dibuat secara otomatis. Saya kira lebih dari setengah pengidentifikasi yang dihasilkan menggunakan ruang putih:

let
    Source = Sql.Database(".", "Test"),
    dbo_pvt = Source{[Schema="dbo",Item="pvt"]}[Data],
    #"Filtered Rows" = Table.SelectRows(dbo_pvt, each [VendorID] <= 4),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Emp1", "Emp2"}),
    #"Grouped Rows" = Table.Group(#"Removed Columns", {"Emp3", "Emp4"}, {{"Count", each List.Sum([Emp5]), type number}})
in
    #"Grouped Rows"

Seperti yang dapat Anda lihat, seperti dalam banyak bahasa ada sintaks tambahan untuk menyamaratakan apa pengenal itu.

Tetapi di tempat-tempat yang tidak ambigu, tidak diperlukan sintaks tambahan:

let
    spaceRecord = [with space = 42, recursive record = @spaceRecord],
    drilldown = spaceRecord[recursive record][recursive record][recursive record][with space]
in
    drilldown   // 42


-1

Bahasa pemrograman o42a yang saya kembangkan saat ini mendukung nama banyak kata . Bahasa tidak memiliki kata kunci sama sekali dan nama-nama biasanya dipisahkan dengan beberapa simbol. Dalam kasus yang jarang terjadi, kedua nama saling mengikuti, garis bawah digunakan untuk memisahkan mereka.



-4

Sunting: Jawaban ini terbukti salah, lihat komentar.

Jika saya memahami pertanyaan Anda dengan benar, kompiler tidak dapat memberikan ruang pada nama pengidentifikasi karena dapat menyebabkan nama duplikat (kecuali pembatas digunakan). Sebagai contoh:

int my = 0; bool my count = false; int count = 0; jika (Hitungan saya) ...

istilah 'jumlah saya' membingungkan karena bisa merujuk ke variabel yang disebut 'jumlah saya' atau mungkin pengembang lupa untuk menulis operator hubungan seperti> antara saya dan menghitung.

COBOL mengizinkan nama divisi dan nama bagian dipisahkan oleh spasi tetapi itu bukan pengidentifikasi dan variabel seperti dalam pertanyaan Anda.


4
Yah, itu bukan kompiler, itu definisi bahasa. Sebagian besar bahasa tidak dapat mengizinkan spasi putih dalam pengidentifikasi karena mereka akan menciptakan ambiguitas.
Steve Bennett

2
Alasanmu nampaknya agak meragukan bagiku. Dalam contoh Anda, satu-satunya alternatif untuk my Countmenjadi nama variabel adalah pemrogram yang membuat kesalahan ketik. Itu bukan ambiguitas. Ambiguitas akan jika ada cara lain yang valid untuk mem-parsing ekspresi. Dengan alasan yang sama Anda bisa mengatakan bahwa memperbolehkan a(b+c)adalah ambigu karena mungkin programmer lupa >dan benar-benar bermaksud a > (b + c).
sepp2k

1
Tetapi (dalam bahasa yang memungkinkan spasi dalam nama variabel) juga tidak ada ambiguitas di if (my count). Anda tidak mengatakan ada cara yang berbeda dan valid untuk menguraikan pernyataan itu (yang berarti ambigu). Anda mengatakan jika menambahkan karakter <, Anda akan mendapatkan parse yang berbeda dan valid. Dan saya katakan jika Anda menambahkan karakter <ke a(b+c)Anda juga berakhir dengan parse yang berbeda dan valid.
sepp2k

1
@SteveBennett Benar. Bahasa apa pun yang memungkinkan spasi dalam nama variabel harus melarangnya dalam nama tipe atau menggunakan sintaks yang berbeda untuk deklarasi tipe (seperti katakanlah var name of the variable : type of the variable) - atau tidak memiliki deklarasi tipe sama sekali.
sepp2k

1
@ sepp2k, sekarang saya mengerti maksud Anda. Terima kasih telah meluangkan waktu untuk menjelaskannya. Jawaban saya salah.
NoChance
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.