Có khoảng trắng trong định danh bao giờ là thành ngữ? [đóng cửa]


43

Kiểu C # gợi ý sử dụng CamelCase trong mã định danh để phân định các từ. Truyền thống Lisp đề nghị sử dụng - dấu gạch ngang - thay vào đó.

Đã bao giờ tồn tại một ngôn ngữ lập trình trong đó việc sử dụng khoảng trắng trong mã định danh không chỉ được phép, mà còn là một thành ngữ thường được sử dụng khi sử dụng mã định danh nhiều từ?

Có thể có các định danh có khoảng trắng trong một số triển khai Đề án , nhưng đó không phải là một thực tiễn được nhìn thấy rộng rãi. Đây là một ví dụ:

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)

Nếu bạn có không gian tên, đó là một dạng định danh ghép. Ví dụ: C ++ : bobs_utilities :: string_functions :: scramble. Đây là một tên và chúng tôi có thể bao gồm khoảng trắng tùy ý nếu chúng tôi muốn vì đó là cú pháp, một mã thông báo không đơn giản. Tên có nhiều thành phần muốn là cú pháp trừu tượng; thông tin không gian tên shoehorning vào một mã định danh về cơ bản là một hack "xáo trộn tên" để thể hiện cấu trúc bên trong văn bản nơi bạn đang thiếu cơ chế để biểu diễn cấu trúc.
Kaz

Khá phổ biến trong JS, có tác giả chính là một anh chàng Scheme.
Erik Reppen

1
@ErikReppen Theo như tôi biết, khoảng trắng không hợp lệ là một phần của số nhận dạng javascript ...
Izkata

Không cho vars không. Đối với tên thuộc tính, chúng ta có thể sử dụng bất kỳ chuỗi nào trong ngoặc. ví dụ: alert({'some Prop':'bob'}['some Prop']);nhưng nếu các tên thuộc tính chuỗi đó thất bại trong bài kiểm tra định danh / nhãn, bạn không thể sử dụng chúng với ký hiệu dấu chấm.
Erik Reppen

Trong Ruby bạn có thể: define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;và sau đó bạn có thể: send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"nhưng nó không phổ biến.
Darek Nędza

Câu trả lời:


66

Trình biên dịch FORTRAN bỏ qua khoảng trắng để:

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

Giống hệt như trình biên dịch có liên quan.

Một số phương ngữ SQL cho phép các không gian được nhúng trong tên cột nhưng chúng cần được bao quanh bởi các backquote hoặc một số dấu phân cách khác trước khi chúng có thể được sử dụng.


7
+1, điều này là mới đối với tôi. Tôi luôn tự hỏi tại sao tôi chỉ có B ở Fortran nhưng bây giờ tôi biết :)
NoChance

20
Cẩm nang FORTRAN của Sun được sử dụng để bao gồm câu này: "Việc tách các từ một cách nhất quán trở thành một phong tục chung về thế kỷ thứ mười sau Công nguyên, và kéo dài đến khoảng năm 1957, khi FORTRAN từ bỏ việc thực hành."
Blrfl

26

Visual Basic (và VBScript) cũng cho phép khoảng trắng trong mã định danh nếu bạn bao quanh mã định danh bằng dấu ngoặc vuông.

Dim [Hello World]
[Hello World] = 123

Tuy nhiên, làm như vậy là khá hiếm.


13

SQL có tính không?

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

3
Điều đó chắc chắn là có thể, nhưng tôi sẽ không gọi nó là thành ngữ.
Joachim Sauer

3
Nếu bạn cần đắp mặt nạ, nó dường như không được khuyến khích.
người dùng không xác định

11

Vâng khoảng trắng là tất cả về ... khoảng trắng:

Hầu hết các ngôn ngữ lập trình hiện đại không xem xét cú pháp các ký tự khoảng trắng (dấu cách, tab và dòng mới), bỏ qua chúng, như thể chúng không có ở đó. Chúng tôi coi đây là một sự bất công thô thiển đối với những thành viên hoàn toàn thân thiện của bộ nhân vật này. Có nên bỏ qua chúng, chỉ vì chúng vô hình? Khoảng trắng là ngôn ngữ tìm cách khắc phục sự cân bằng. Bất kỳ ký tự không khoảng trắng nào đều bị bỏ qua; chỉ khoảng trắng, tab và dòng mới được coi là cú pháp.

Thật không may, Markdown không hỗ trợ cú pháp của nó và tôi không thể cho bạn xem một số mã, nhưng Wikipedia có một mẫu mã thân thiện với con người .


@ sepp2k Khoảng trắng có nhãn.
yannis

Oh bạn nói đúng. Đừng bận tâm.
sepp2k

"Hầu hết các ngôn ngữ lập trình hiện đại không xem xét các ký tự khoảng trắng". Python nào :)
jadkik94

@ jadkik94 Python không sử dụng khoảng trắng, nhưng để thụt lề không phải là định danh.
yannis

@YannisRizos Ồ, vâng. Và cũng đúng là hầu hết các ngôn ngữ đều không sử dụng khoảng trắng (định danh hay không)
jadkik94

11

Trong Algol 68, bạn có thể có không gian trong các định danh (tôi không nhớ chúng có ý nghĩa hay không). Nhưng các từ khóa đã được đánh dấu bằng cách vuốt . Sử dụng tên với không gian trong đó là thành ngữ (ít nhất là xung quanh tôi).

VHDL cho phép thoát định danh với không gian quan trọng trong đó : \foo bar\. Điều này cũng cho phép sử dụng từ khóa làm định danh \and\, bất kỳ ký tự \n<42>\và độ nhạy trường hợp nào trong số nhận dạng ( \Foo\\foo\khác nhau trong khi Foofootương đương, và khác với một trong hai \Foo\\foo\!). Verilog cũng có các số nhận dạng xen kẽ với hầu hết các đặc điểm này (số nhận dạng bình thường có phân biệt chữ hoa chữ thường và thoát chúng một cách không cần thiết không tạo số nhận dạng khác), nhưng không cho phép khoảng trắng trong chúng. Nhu cầu từ các định danh thoát trong VHDL và Verilog xuất phát từ thực tế chúng thường được sản xuất tự động từ các nguồn khác (như sơ đồ) trong đó các định danh thông thường không có hạn chế như trong ngôn ngữ lập trình; AFAIK, chúng không được sử dụng một cách thành ngữ trong các trường hợp khác.


Tôi dường như nhớ (nhìn lại những năm 1980 ở đây!) Rằng CORAL đã làm một cái gì đó tương tự - bạn có thể (và đã) có khoảng trắng trong tên biến, nhưng từ khóa sau đó có trích dẫn xung quanh chúng (như 'DEFINE'và, một sở thích cá nhân , 'COMMENT'. Chúng tôi đã sử dụng để sử dụng bộ xử lý macro để thay thế các bộ xử lý này bằng các phiên bản chưa được trích dẫn).
AAT

10

Tôi không biết nếu bạn coi MediaWiki wikitext là ngôn ngữ, nhưng tên có khoảng trắng chắc chắn là thành ngữ:

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

Trong đó "phần mở rộng" là tên của một mẫu (http://en.wikipedia.org/wiki/Template:Expand_section)

Tôi đoán nó đáp ứng các tiêu chí - một ngôn ngữ mà các định danh thường xuyên chứa các khoảng trắng. Không bao giờ (tôi nghĩ vậy?) Mơ hồ vì các định danh luôn được bao quanh bởi rất nhiều dấu chấm câu để tách chúng khỏi văn bản wiki thô.


2
Mặc dù wikitext chắc chắn là ngôn ngữ chính thức, tôi sẽ không gọi nó là ngôn ngữ lập trình (thậm chí nó không có vòng lặp).
Svick

@svick: Cả Haskell, Smalltalk, Scheme, Clojure, Erlang, Lambda Compus, Turing Machines, Io, Ioke, Seph, giật
Jörg W Mittag

@ JörgWMittag, nhưng họ có đệ quy, đó chỉ là một cách khác để thể hiện các vòng lặp. Wikitext thậm chí không có điều đó.
Svick

@svick Tùy thuộc vào tiện ích mở rộng nào bạn đã cài đặt, bạn có được một số cấu trúc điều khiển trong đánh dấu mediawiki. Đặc biệt bạn nhận được ifs và đệ quy. Cú pháp và hiệu suất là khá xấu mặc dù. Các mẫu hoạt động khá giống các chức năng và tên của chúng được tính là định danh trong sách của tôi.
CodeInChaos

1
Thật thú vị, từ [[Wikipedia: Transinating]]: "Không có chức năng lặp thực sự được tích hợp trong phần mềm Mediawiki vào thời điểm này ... nhưng có một số thủ thuật để bắt chước chúng. Ví dụ, liên tục gọi một mẫu liên tục gọi một mẫu các mẫu khác nhau có thể bắt chước một vòng lặp kép. Các mẫu cũng có thể bị ép buộc tự gọi (thường bị phần mềm Mediawiki cấm qua một phiên bản duy nhất, để ngăn chặn các vòng lặp vô hạn), bằng cách sử dụng các chuyển hướng một cách khéo léo (xem m: Mẫu: Loop1 (liên kết ngược, chỉnh sửa)) Xem thêm m: Trợ giúp: Chuyển đổi đệ quy của wikitext. "
Steve Bennett

9

Thông tin 7 là một hệ thống để phát triển tiểu thuyết tương tác sử dụng cú pháp ngôn ngữ tự nhiên, giống như cú pháp, trong đó định danh nhiều từ là phổ biến:

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

Tất nhiên, hạn chế là một mã định danh không thể chứa từ khóa khi điều này không rõ ràng.

Trong một tĩnh mạch tương tự, các định danh có dấu gạch dưới trong Agda có thể được sử dụng mixfix, ví dụ đơn giản nhất có lẽ là if_then_else_toán tử:

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 cho phép định danh tùy ý bằng cách sử dụng backticks. Việc sử dụng thông thường cho việc này là để gọi Thread.`yield`yieldlà một từ dành riêng trong Scala. Điều này có thể là (ab) được sử dụng để có khoảng trắng trong tên, mặc dù điều đó sẽ khác xa với mã Scala thành ngữ:

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

Heck, bạn thậm chí có thể có các tab trong định danh:

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

Tôi cho rằng điều này có thể hình dung là thành ngữ cho dân gian lập trình biết chữ. Có lẽ.


Scala cho phép các ký tự như +trong tên phương thức. Vì vậy obj.a+=1, nó sẽ phân tích nó như thể a+=là một phương thức. Nhà phát minh Martin Oderky trong sách giáo khoa của ông giả định rằng các lập trình viên thường bao gồm các khoảng trắng, do đó sự mơ hồ của trình phân tích cú pháp thực tế không quá khó khăn.
Jesvin Jose

1
@aitchnyu: Trên thực tế, trong các định danh hỗn hợp, phần chữ và số và phần vận hành cần được phân tách bằng dấu gạch dưới. obj.a+=1tương đương với obj.a += 1tương đương với obj.a.+=(1). Bạn sẽ cần phải có obj.a_+=1nếu bạn muốn nó hoạt động theo cách bạn mô tả. (Trên thực tế, điều đó sẽ đưa ra một lỗi phân tích cú pháp, bạn cần phải gọi obj.a_+=(1)hoặc obj a_+= 1.)
Jörg W Mittag

Đó không phải là tab, đó là một trạm không gian. Và theo trạm vũ trụ, tôi có nghĩa là một chuỗi thoát tab.
Thomas Eding


4

Bạn có thể coi đây là trường hợp trong Cucumber / Gherkin , trong đó tên hàm là các câu có hiệu quả với các đối số được nhúng bên trong chúng.

Là một phần mở rộng, tôi hy vọng điều này sẽ phổ biến hơn trong các DSL nhỏ , nơi ngôn ngữ được cho là thân thiện với những người không phát triển. Ví dụ: nhiều công cụ quy tắc cung cấp một lỗi để xác định quy tắc với một mô tả giống như tiếng Anh, trong đó các khoảng trắng có thể được sử dụng trong các định danh.


3

FWIW, Tcl cho phép khoảng trắng (và gần như mọi ký tự khác) trong mã định danh, mặc dù việc tận dụng tính năng này là không phổ biến. Lý do chính nó không được sử dụng rất thường xuyên chỉ là bạn phải sử dụng trích dẫn thích hợp. Ví dụ: sau đây đặt một biến có tên "tên tôi" thành "bob", sau đó in nó

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

OTOH, nó rất hữu ích khi xây dựng các biến động vì khi tạo các biến đó, người ta không phải lo lắng về các ký tự bất hợp pháp



1

Nếu bạn xem xét một DSL tự động kiểm tra một ngôn ngữ, khung robot cho phép khoảng trắng trong tên từ khóa và nó rất thành ngữ. Trong ví dụ sau "Say hello" là tên từ khóa, "Ví dụ trường hợp kiểm tra" là tên trường hợp kiểm tra và "$ {tên đầu tiên}" là một biến:

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

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

1

Các ngôn ngữ 4D cho phép khoảng trắng trong tên phương pháp và các biến. Nó thường được tán thành trong cộng đồng, nhưng tất cả các phương thức và biến tích hợp sử dụng chúng khi áp dụng ( SET MENU ITEM PARAMETERví dụ)


0

Smalltalk có các phương thức từ khóa như a:b:c:liên quan đến khoảng trắng khi được gọi. Vd : a: 100 b: 200 c: 300. Đây là một thành ngữ tiêu chuẩn trong ngôn ngữ.


0

Powershell cho phép khoảng trắng trong tên biến:

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

PS C:\> ${the var}
100

0

Tôi đã thấy đề cập đến tương tự cho VB nhưng trong JS nó được sử dụng rất nhiều trên thực tế. Bất kỳ thuộc tính nào của một đối tượng trong JavaScript đều có thể được truy cập và được đặt ở dạng chuỗi với dấu ngoặc vuông hoặc đơn giản là các chuỗi trong các đối tượng bằng chữ. Tên thuộc tính không tuân theo quy tắc đặt tên biến của JS không thể truy cập thông qua. ký hiệu nhưng chúng là tiện dụng. Chẳng hạn, bạn có thể muốn ánh xạ URL tới hành vi hoặc tham chiếu một nhóm người theo tên khi bạn chắc chắn họ là duy nhất. Nó thường rất thuận tiện và dễ đọc:

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

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

Điều này cũng giúp dễ dàng cấu trúc lại JSON để dễ sử dụng mà không làm mất yếu tố đối tượng tức thời khi rơi vào JS.


Thật buồn cười khi đây là đề cập duy nhất về JavaScript. Có, các phương thức và thuộc tính có thể chứa các chuỗi: foo['my method']()foo['my property']
Steve Bennett

0

Power Query sử dụng rất nhiều mã được tạo tự động. Tôi đoán hơn một nửa số nhận dạng được tạo sử dụng khoảng trắng:

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"

Như bạn có thể thấy, giống như trong nhiều ngôn ngữ, có thêm cú pháp để phân biệt định danh là gì.

Nhưng ở những nơi không rõ ràng, không cần thêm cú pháp:

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


-1

Ngôn ngữ lập trình o42a tôi hiện đang phát triển hỗ trợ một tên nhiều từ . Ngôn ngữ không có từ khóa nào cả và tên thường được phân tách bằng một số ký hiệu. Trong trường hợp hiếm hoi hai tên theo nhau, dấu gạch dưới được sử dụng để phân tách chúng.



-4

Chỉnh sửa: Câu trả lời này đã được hiển thị là không chính xác, xem các ý kiến.

Nếu tôi hiểu chính xác câu hỏi của bạn, trình biên dịch không thể cho phép (các) khoảng trắng trong tên định danh vì nó có thể gây ra các tên trùng lặp (trừ khi sử dụng dấu phân cách). Ví dụ:

int my = 0; bool đếm của tôi = sai; số đếm = 0; nếu (tính của tôi) ...

thuật ngữ 'số đếm của tôi' gây nhầm lẫn, nó có thể đề cập đến biến có tên là 'số đếm của tôi' hoặc có thể nhà phát triển đã quên viết một toán tử quan hệ như> giữa tôi và đếm.

COBOL cho phép tên phân chia và tên phần được phân tách bằng dấu cách nhưng chúng không phải là định danh và biến như trong câu hỏi của bạn.


4
Chà, nó không phải là trình biên dịch, đó là định nghĩa ngôn ngữ. Hầu hết các ngôn ngữ không thể cho phép khoảng trắng trong mã định danh vì chúng sẽ tạo ra sự mơ hồ.
Steve Bennett

2
Lý luận của bạn có vẻ như iffy đối với tôi. Trong ví dụ của bạn, sự thay thế duy nhất để my Counttrở thành một tên biến sẽ là lập trình viên đã mắc lỗi đánh máy. Đó không phải là sự mơ hồ. Sự mơ hồ sẽ là nếu có một cách hợp lệ khác để phân tích biểu thức. Với lý do tương tự, bạn có thể nói rằng việc cho phép a(b+c)là mơ hồ bởi vì có thể lập trình viên đã quên một >và thực sự có ý nghĩa a > (b + c).
sepp2k

1
Nhưng (trong một ngôn ngữ cho phép khoảng trắng trong tên biến) cũng không có sự mơ hồ trong if (my count). Bạn không nói rằng có một cách khác nhau, hợp lệ để phân tích câu nói đó (điều đó có nghĩa là nó mơ hồ). Bạn đang nói nếu bạn thêm nhân vật <, bạn sẽ có một phân tích hợp lệ khác. Và tôi đang nói nếu bạn thêm nhân vật <cho a(b+c)bạn thì cuối cùng cũng có một phân tích hợp lệ khác.
sepp2k

1
@SteveBennett Đúng. Bất kỳ ngôn ngữ nào cho phép khoảng trắng trong tên biến sẽ phải không cho phép chúng trong tên loại hoặc sử dụng một cú pháp khác nhau cho khai báo kiểu (như nói var name of the variable : type of the variable) - hoặc hoàn toàn không có khai báo kiểu.
sepp2k

1
@ sepp2k, bây giờ tôi đã nhận được điểm của bạn. Cảm ơn đã dành thời gian để làm cho nó rõ ràng. Câu trả lời của tôi là không chính xác.
NoChance
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.