web-dev-qa-db-ja.com

識別子の空白は慣用的なものになっていますか?

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)
49
dharmatech

FORTRANコンパイラはスペースを無視したので、

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

コンパイラに関する限り、同じでした。

一部のSQL方言では、列名にスペースを埋め込むことができますが、使用する前にバッククォートまたはその他の区切り文字で囲む必要があります。

75
James Anderson

Visual Basic(およびVBScript)では、識別子を角かっこで囲むと、識別子に空白を含めることができます。

Dim [Hello World]
[Hello World] = 123

ただし、そうすることは非常にまれです。

29
Eric Lippert

SQLはカウントされますか?

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

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
15
Jon Purdy

ALGOL 68では、識別子にスペースを含めることができました(それらが重要であったかどうかは覚えていません)。しかし、キーワードは stroping でマークされていました。スペースを含む名前を使用することは慣用的でした(少なくとも私の周りでは)。

VHDLでは、スペースを含むエスケープされた識別子を使用できます:\foo bar\。これにより、識別子としてキーワードを使用することもできます\and\、任意の文字\n<42>\および識別子の大文字と小文字の区別(\Foo\および\foo\は異なりますが、Foofooは同等であり、どちらかとは異なります\Foo\および\foo\!)。 Verilogには、これらの特性のほとんどを備えたespaced識別子もあります(通常の識別子は大文字と小文字が区別され、不必要にエスケープしても別の識別子にはなりません)がスペースを許可していません。 VHDLおよびVerilogでのエスケープされた識別子の必要性は、識別子がプログラミング言語と同じ制限を慣習的に持たない他のソース(回路図など)から自動的に生成されることが多いという事実から来ています。私の知る限り、他の状況では慣用的に使用されていません。

12
AProgrammer

さて Whitespace はすべてのことについて... whitespace:

最近のほとんどのプログラミング言語は、空白文字(スペース、タブ、改行)の構文を考慮せず、それらが存在しないかのように無視します。これは、文字セットのこれらの完全に友好的なメンバーにとっては重大な不当であると考えています。それらが見えないからといって、無視されるべきでしょうか?ホワイトスペースは、バランスを取り戻すことを目的とする言語です。空白以外の文字はすべて無視されます。スペース、タブ、改行のみが構文と見なされます。

残念ながら、Markdownはその構文をサポートしておらず、一部のコードを示すことはできませんが、Wikipediaには 人間にやさしいコードサンプル があります。

11
yannis

MediaWikiウィキテキストを言語と見なすかどうかはわかりませんが、スペースを含む名前は間違いなく慣用的です。

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

「展開セクション」はテンプレートの名前です(http://en.wikipedia.org/wiki/Template:Expand_section)

私はそれが基準を満たしていると思います-識別子が日常的にスペースを含む言語。識別子は常に生のwikiテキストから分離するために多くの句読点で囲まれているため、あいまいではありません(私はそう思いますか?)。

11
Steve Bennett

Scalaでは、バックティックを使用して任意の識別子を使用できます。 yieldはScalaの予約語であるため、これの通常の使用法はThread.`yield`を呼び出すことです。名前にスペースを含めるためにこれを(ab)使用できますが、慣用的なScalaコードからはほど遠いでしょう:

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

ヘッ、あなたは識別子にタブを持つことさえできます:

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

私はこれがおそらくが文芸的プログラミングの人々にとって慣用的であるかもしれないと思います。多分。

8
Peter C

これは Cucumber/Gherkin の場合であると考えるかもしれません。ここで、関数名は、引数が内部に埋め込まれた効果的な文です。

拡張機能として、私はこれが小さな DSLs でより一般的になることを期待します。そこでは、言語は非開発者にとってフレンドリーであるはずです。たとえば、多くのルールエンジンは、識別子にスペースを使用できる英語のような説明でルールを定義する機能を提供します。

5
Chris Pitman

F#では識別子名に空白を使用できますが、二重バッククォートで囲む必要があります。この質問の回答を参照してください: https://stackoverflow.com/questions/6639688/using-keywords-as-identifiers-in-f

5
Matt H

FWIW、Tclでは識別子にスペース(およびその他すべての文字)を使用できますが、この機能を利用することは一般的ではありません。頻繁に使用されない主な理由は、適切な引用を使用しなければならないことだけです。たとえば、次の例では、「my name」という名前の変数を「bob」に設定し、それを出力します。

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

OTOH、変数を動的に構築するときに非常に便利です。そのような変数を作成するときに、不正な文字を気にする必要がないためです。

4
Bryan Oakley

私が知っていることはほとんどありません。 私は1つに取り組んでいます 、および プログラミング言語Inform はありますが、それは正確には汎用プログラミング言語ではありません。

3
Telastyn

自動テスト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
2
Bryan Oakley

Powershellでは、変数名にスペースを使用できます。

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

PS C:\> ${the var}
100
1
dharmatech

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を簡単に再構築して使いやすくすることもできます。

1
Erik Reppen

4D言語 は、メソッド名と変数に空白を許可します。これは一般的にコミュニティ内で嫌われていますが、すべての組み込みメソッドと変数は、該当する場合にそれらを使用します(SET MENU ITEM PARAMETER、 例えば)

1
3Doubloons

Smalltalkは、起動時に空白を含むa:b:c:などのキーワードメソッドを備えています。例:a: 100 b: 200 c: 300。これは言語の標準的なイディオムです。

0
dharmatech

Power Query は、自動生成されたコードを大量に使用します。生成された識別子の半分以上が空白を使用していると思います:

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
0
Carl Walsh