식별자의 공백은 관용적입니까? [닫은]


43

C # 스타일은 식별자에 CamelCase 를 사용하여 단어를 구분하도록 제안 합니다. Lisp 전통은 대쉬 대신 사용을 제안합니다.

식별자에 공백을 사용할 수있을뿐만 아니라 다중 단어 식별자를 사용할 때 일반적으로 사용되는 관용구가있는 프로그래밍 언어가 존재 했습니까?

일부 Scheme 구현 에서 공백이있는 식별자를 가질 수는 있지만 널리 사용되는 것은 아닙니다. 예를 들면 다음과 같습니다.

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)

네임 스페이스가 있으면 복합 식별자 형식입니다. 예를 들어 C ++ : bobs_utilities :: string_functions :: scramble. 이것은 이름이며, 단순한 토큰이 아닌 구문이기 때문에 원하는 경우 임의의 공백을 포함시킬 수 있습니다. 여러 구성 요소가있는 이름은 추상 구문이되기를 원합니다. 단일 식별자에 대한 구두 각 네임 스페이스 정보는 기본적으로 구조를 표현할 메커니즘이없는 텍스트 내부의 구조를 나타내는 "name mangling"핵입니다.
Kaz

JS의 주요 저자는 Scheme guy였습니다.
Erik Reppen 2016 년

1
@ErikReppen 내가 아는 한, 공백은 자바 스크립트 식별자의 일부로 유효하지 않습니다 ...
Izkata

vars no에는 해당되지 않습니다. 속성 이름의 경우 대괄호 안에 모든 문자열을 사용할 수 있습니다. 예를 들어 alert({'some Prop':'bob'}['some Prop']);해당 문자열 속성 이름이 식별자 / 라벨 테스트에 실패하면 점 표기법으로 사용할 수 없습니다.
Erik Reppen

루비에서는 define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;다음과 같은 작업을 수행 할 수 있습니다 send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~".
Darek Nędza

답변:


66

FORTRAN 컴파일러는 공백을 무시했습니다.

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

컴파일러에 관한 한 동일했습니다.

일부 SQL 언어는 열 이름에 공백을 포함 할 수 있지만 백 따옴표 나 다른 구분 기호로 묶어야 사용할 수 있습니다.


7
+1, 이것은 새로운 것입니다. 나는 왜 내가 왜 포트란에서 B 만 받았는지 궁금해했지만 지금은 알고 있습니다 :)
NoChance

19
Sun의 FORTRAN 매뉴얼은이 문장을 포함하는 데 사용되었습니다. "일관되게 단어를 공백으로 분리하는 것은 AD 10 세기에 대한 일반적인 관습이되었으며 FORTRAN이 관행을 포기한 1957 년까지 지속되었습니다."
Blrfl

26

식별자를 대괄호로 묶는 경우 Visual Basic (및 VBScript)도 식별자에 공백을 허용합니다.

Dim [Hello World]
[Hello World] = 123

그러나 그렇게하는 것은 매우 드 rare니다.


13

SQL은 중요합니까?

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

3
확실히 가능하지만 관용적이라고 부르지는 않을 것입니다.
Joachim Sauer

3
마스킹이 필요한 경우 권장되지 않는 것 같습니다.
사용자가 알 수 없음

11

공백 은 모두 ... 공백입니다.

대부분의 최신 프로그래밍 언어는 공백 문자 (공백, 탭 및 줄 바꿈) 구문을 고려하지 않고 마치 마치 존재하지 않는 것처럼 무시합니다. 우리는 이것이 캐릭터 세트의 완벽하게 친절한 멤버들에게 심각한 불의라고 생각합니다. 그들이 보이지 않기 때문에 무시해야합니까? 공백은 균형을 맞추려고하는 언어입니다. 공백이 아닌 문자는 무시됩니다. 공백, 탭 및 줄 바꿈 만 구문으로 간주됩니다.

불행히도 Markdown은 구문을 지원하지 않으며 일부 코드를 보여줄 수 없지만 Wikipedia에는 친숙한 코드 샘플이 있습니다.


@ sepp2k 공백에는 레이블이 있습니다.
yannis

아, 맞아 그럼 신경 쓰지 마
sepp2k

"대부분의 현대 프로그래밍 언어는 공백 문자를 고려하지 않습니다". Python does :)
jadkik94

@ jadkik94 파이썬은 공백을 사용하지만 식별자로 들여 쓰기에는 사용하지 않습니다.
yannis

@YannisRizos 아, 네 그리고 대부분의 언어가 공백을 전혀 사용하지 않는 것이 사실입니다 (식별자 여부)
jadkik94

11

Algol 68에서는 식별자에 공백이있을 수 있습니다 (정확한지 여부는 기억 나지 않습니다). 그러나 키워드는을 쓰다듬어 표시되었습니다 . 그 안에 공백이있는 이름을 사용하는 것은 관용적이었습니다 (적어도 내 주변).

VHDL을 사용하면 이스케이프 된 식별자에 공백이 많이 있습니다 \foo bar\. 이는 식별자로서 사용 키워드 또한 허용 \and\모든 문자 \n<42>\식별자 및 감도 경우 ( \Foo\그리고 \foo\동안 상이 Foofoo동등하고, 상이한 하나 \Foo\\foo\!). Verilog는 또한 대부분의 이러한 특성을 가진 이스케이프 된 식별자를 가지고 있습니다 (일반 식별자는 대소 문자를 구분하고 불필요하게 이스케이프하면 다른 식별자를 만들지 않습니다). 그러나 공백을 허용하지 않습니다. VHDL 및 Verilog에서 이스케이프 된 식별자의 필요성은 식별자가 프로그래밍 언어와 동일한 제한을 갖지 않는 다른 소스 (예 : 회로도)에서 자동으로 생성되기 때문에 발생합니다. AFAIK는 다른 상황에서는 관용적으로 사용되지 않습니다.


CORAL이 비슷한 것을했음을 기억합니다 (여기에서 1980 년대를 되돌아보십시오!) 변수 이름에 공백이있을 수는 있지만 키워드는 그 주위에 따옴표가 있습니다 ( 'DEFINE'개인 선호도 등) 'COMMENT'. 매크로 프로세서를 사용하여 인용되지 않은 버전으로 바꿉니다.
AAT

10

MediaWiki 위키 텍스트를 언어로 생각하는지 모르겠지만 공백이있는 이름은 분명히 관용적입니다.

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

여기서 "확장 섹션"은 템플리트의 이름입니다 (http://en.wikipedia.org/wiki/Template:Expand_section).

나는 식별자가 일상적으로 공백을 포함하는 언어 인 기준을 충족한다고 생각합니다. 식별자는 항상 원시 위키 텍스트와 구분하기 위해 많은 구두점으로 둘러싸여 있기 때문에 결코 모호하지 않습니다.


2
위키 텍스트는 확실히 공식 언어이지만 프로그래밍 언어 라고는하지 않습니다 (루프조차 없습니다).
svick

@svick : Haskell, Smalltalk, Scheme, Clojure, Erlang, Lambda Calculus, Turing Machines, Io, Ioke, Seph,…
Jörg W Mittag

@ JörgWMittag, 그러나 그들은 반복을 표현하는데, 이것은 루프를 표현하는 다른 방법입니다. 위키 텍스트에는 그런 것도 없습니다.
svick April

@svick 설치 한 확장에 따라 mediawiki 마크 업에 몇 가지 제어 구조가 있습니다. 특히 ifs와 재귀 를 얻습니다 . 구문과 성능은 꽤 나쁩니다. 템플릿은 함수와 거의 비슷하게 동작하며, 책 이름은 식별자로 간주됩니다.
코드 InChaos

1
[[Wikipedia : Transclusion]]의 흥미로운 점 : "현재 Mediawiki 소프트웨어에는 실제 루핑 기능이 내장되어 있지 않습니다.하지만이를 흉내 내기위한 몇 가지 트릭이 있습니다. 예를 들어, 다른 템플릿을 사용하면 이중 루프를 모방 할 수 있으며, 리디렉션을 교묘하게 사용하여 템플릿을 직접 호출 (무제한 루프를 방지하기 위해 Mediawiki 소프트웨어에서 단일 인스턴스를 통해 금지) 할 수도 있습니다 (m : Template : Loop1 (백 링크, 편집)) m : 도움말 : wikitext의 재귀 변환도 참조하십시오. "
Steve Bennett

9

Inform 7 은 자연어와 유사한 구문을 사용하여 대화 형 소설을 개발하기위한 시스템으로, 다중 단어 식별자가 일반적입니다.

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

물론, 이것이 모호 할 때 식별자에 키워드를 포함 할 수 없다는 제한이 있습니다.

비슷한 맥락에서 Agda에 밑줄이있는 식별자를 mixfix로 사용할 수 있습니다. 가장 간단한 예는 아마도 if_then_else_연산자입니다.

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

6

스칼라는 백틱을 사용하여 임의의 식별자를 허용합니다. 스칼라에서는 예약어 Thread.`yield`이므로 일반적으로이를 사용합니다 yield. 이것은 관용 스칼라 코드와는 거리가 멀지 만 이름에 공백을 두는 데 사용될 수 있습니다.

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

심지어 식별자에 탭을 가질 수도 있습니다.

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

나는이 수도있을 것 같군요 생각할 글을 읽고 프로그래밍 민속에 대한 관용적합니다. 아마도.


스칼라는 +메소드 이름 과 같은 문자를 허용 합니다. 그래서 obj.a+=1, 그것은 마치 a+=메소드 인 것처럼 파싱 할 것 입니다. 발명가 Martin Odersky는 그의 교과서에서 프로그래머가 보통 공백을 포함 한다고 가정 하여 파서 모호성이 실제로 문제가되지 않는다고 가정합니다 .
Jesvin Jose

1
@aitchnyu : 실제로 혼합 식별자에서 영숫자 부분과 연산자 부분은 밑줄로 구분해야합니다. obj.a+=1동등 obj.a += 1동등하다 obj.a.+=(1). 당신이 obj.a_+=1묘사 한대로 작동하기를 원한다면 당신은 그것을 필요로 할 것 입니다. (실제로 구문 분석 오류가 발생하면 obj.a_+=(1)또는을 호출해야합니다 obj a_+= 1.)
Jörg W Mittag

그것은 탭이 아닙니다. 그것은 우주 정거장입니다. 우주 정거장이란 탭 이스케이프 시퀀스를 의미합니다.
Thomas Eding


4

이것을 Cucumber / Gherkin 의 경우라고 생각할 수 있습니다 . 여기서 함수 이름은 인수가 포함 된 효과적인 문장입니다.

확장으로, 나는 언어가 비 개발자에게 친숙한 작은 DSL 에서 이것이 더 일반적 일 것으로 기대합니다 . 예를 들어, 많은 규칙 엔진은 공백을 식별자로 사용할 수있는 영어와 유사한 설명으로 규칙을 정의 할 수있는 기능을 제공합니다.


3

FWIW에서 Tcl은 식별자에서 공백 (및 거의 모든 문자)을 허용하지만이 기능을 이용하는 것은 일반적이지 않습니다. 자주 사용되지 않는 주된 이유는 적절한 인용을 사용해야하기 때문입니다. 예를 들어, 다음은 "my name"이라는 변수를 "bob"으로 설정 한 다음 인쇄합니다.

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

OTOH, 변수를 만들 때 불법 문자에 대해 걱정할 필요가 없으므로 변수를 동적으로 작성할 때 매우 유용합니다



1

자동 테스트 DSL을 언어로 생각하면 로봇 프레임 워크 는 키워드 이름에 공백을 허용하며 관용적입니다. 다음 예에서 "Say hello"는 키워드 이름이고 "Example test case"는 테스트 케이스 이름이고 "$ {first name}"은 변수입니다.

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

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

1

4D 언어는 메소드 이름과 변수에 공백을 할 수 있습니다. 일반적으로 커뮤니티 내에서 눈살을 찌푸 리지만 모든 내장 메소드 및 변수는 해당되는 경우이를 사용합니다 ( SET MENU ITEM PARAMETER예 :).


0

스몰 토크는 a:b:c:호출 할 때 공백을 포함하는 키워드 방법을 제공합니다 . 예 : a: 100 b: 200 c: 300. 이것은 언어의 표준 관용구입니다.


0

Powershell은 변수 이름에 공백을 허용합니다.

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

PS C:\> ${the var}
100

0

VB와 비슷한 언급을 보았지만 JS에서는 실제로 많이 사용됩니다. JavaScript에서 객체의 모든 속성에 액세스하고 대괄호를 사용하여 문자열 형태로 또는 객체 리터럴의 문자열로 간단히 설정할 수 있습니다. JS의 변수 명명 규칙을 따르지 않는 속성 이름은을 통해 액세스 할 수 없습니다. 표기법이지만 편리합니다. 예를 들어 URL을 동작에 매핑하거나 모든 고유 한 이름을 가진 사람들을 이름으로 참조 할 수 있습니다. 종종 매우 편리하고 읽기 쉽습니다.

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

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

또한 JS로 떨어질 때 인스턴트 객체 요소를 잃지 않고 사용하기 쉽도록 JSON을 쉽게 재구성 할 수 있습니다.


이것이 JavaScript에 대한 유일한 언급이라는 것이 유감입니다. 예, 방법 및 속성은 문자열을 포함 할 수 있습니다 : foo['my method']()foo['my property']
스티브 베넷에게

0

파워 쿼리 는 자동으로 생성 된 많은 코드를 사용합니다. 생성 된 식별자의 절반 이상이 공백을 사용한다고 생각합니다.

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"

보시다시피, 많은 언어 에서처럼 식별자가 무엇인지 명확하게하는 추가 구문이 있습니다.

그러나 모호하지 않은 곳에서는 추가 구문이 필요하지 않습니다.

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


-1

현재 개발중인 o42a 프로그래밍 언어는 여러 단어로 된 이름을 지원 합니다 . 언어에는 키워드가 전혀 없으며 이름은 일반적으로 일부 기호로 구분됩니다. 드문 경우에 두 이름이 서로 뒤 따르므로 밑줄을 사용하여 구분합니다.



-4

편집 :이 답변이 올바르지 않은 것으로 나타났습니다. 의견을 참조하십시오.

귀하의 질문을 올바르게 이해하면 컴파일러는 식별자 이름에 공백을 허용하지 않습니다 (구분자가 사용되지 않는 한) 중복 이름을 유발할 수 있기 때문입니다. 예를 들면 다음과 같습니다.

int my = 0; 내 카운트 부울 = 거짓; 정수 카운트 = 0; 만약에 (내 수) ...

'my count'라는 용어는 혼동되므로 'my count'라는 변수를 참조하거나 개발자가 my와 count 사이에>와 같은 관계 연산자를 작성하는 것을 잊었을 수 있습니다.

COBOL을 사용하면 구분 이름과 섹션 이름을 공백으로 구분할 수 있지만 질문과 같이 식별자 및 변수는 아닙니다.


4
글쎄, 그것은 컴파일러가 아니며 언어 정의입니다. 대부분의 언어는 모호성을 생성하므로 식별자에서 공백을 허용하지 않습니다.
Steve Bennett

2
당신의 추론은 나에게 유쾌한 것 같습니다. 귀하의 예에서 my Count변수 이름 대신 유일한 대안 은 프로그래머가 오타를 만든 것입니다. 모호하지 않습니다. 표현을 구문 분석하는 다른 유효한 방법 이 있다면 모호 할 수 있습니다 . 같은 추론으로 a(b+c)프로그래머가 a를 잊고 >의미 하기 때문에 허용 이 모호 하다고 말할 수 a > (b + c)있습니다.
sepp2k

1
그러나 (변수 이름에 공백을 허용하는 언어)에도 모호성이 없습니다 if (my count). 그 진술을 파싱하는 다른 유효한 방법이 있다는 것을 말하는 것이 아닙니다 (모호하다는 것을 의미합니다). 문자를 추가하면 <다른 유효한 구문 분석으로 끝납니다. 그리고 캐릭터 <를 추가하면 a(b+c)다른 유효한 구문 분석으로 끝납니다.
sepp2k

1
@SteveBennett 맞습니다. 변수 이름에 공백을 허용 한 모든 언어는 형식 이름에서 공백을 허용하지 않거나 형식 선언에 다른 구문 (예 :)을 사용 var name of the variable : type of the variable하거나 형식 선언이 전혀 없어야합니다.
sepp2k

1
@ sepp2k, 이제 요점을 알았습니다. 시간을내어 명확하게 설명해 주셔서 감사합니다. 내 대답이 잘못되었습니다.
NoChance
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.