識別子の空白は慣用的なものですか?[閉まっている]


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。これは名前であり、単純なトークンではなく構文であるため、必要に応じて任意の空白を含めることができます。複数のコンポーネントを持つ名前は、抽象構文にしたいです。名前空間情報を単一の識別子にシューホーン化することは、基本的に、構造を表現するメカニズムを欠いているテキスト内の構造を表現するための「名前マングリング」ハックです。
カズ

JSではかなり一般的で、その主な著者はSchemeの男でした。
エリックReppen

1
@ErikReppen私の知る限り、スペースはjavascript識別子の一部として有効ではありません
...-Izkata

vars noではありません。プロパティ名には、括弧内の任意の文字列を使用できます。たとえばalert({'some Prop':'bob'}['some Prop']);、これらの文字列プロパティ名が識別子/ラベルテストに失敗した場合、それらをドット表記で使用することはできません。
エリックReppen

Rubyでは次のことができます。define_singleton_method "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~" do; puts 42; end;それから次のことができます:send "sjdlkfjsljk#$SDEF SDFSDF@# @#$!!~"しかし、それは一般的ではありません。
ダレクヌザ14

回答:


66

FORTRANコンパイラーはスペースを無視しました。

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

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

一部のSQLダイアレクトでは、列名にスペースを埋め込むことができますが、使用する前に逆引用符またはその他の区切り文字で囲む必要があります。


7
+1、これは私にとって新しいものです。FortranでBしか取得できなかったのはなぜだろうといつも思っていましたが、今ではわかっています:)
NoChance

20
SunのFORTRANマニュアルには、次の文が含まれていました。「一貫して単語をスペースで区切るのは、10世紀の広告に関する一般的な習慣となり、FORTRANが練習を放棄した1957年頃まで続きました。」
Blrfl

26

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

Dim [Hello World]
[Hello World] = 123

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



11

まあホワイトスペースとは...ホワイトスペースのことです:

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

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


@ sepp2k空白にはラベルがあります。
ヤニス

ああ、あなたは正しい。じゃあ心配しないで。
sepp2k

「ほとんどの最新のプログラミング言語は空白文字を考慮していません」。Pythonは:)
jadkik94

@ jadkik94 Pythonは空白を使用しますが、識別子としてではなくインデントに使用します。
ヤニス

@YannisRizosああ、はい。また、ほとんどの言語が空白をまったく使用しない(識別子の有無にかかわらず)ことも事実です
-jadkik94

11

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

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


私が覚えているようだCORALは、同様の何かをしたこと(ここでは1980年代に見てバックを!) -あなた(としました)(変数名に空白を持っていますが、キーワード、それらを囲む引用符を持っていたようでした'DEFINE'と、個人的な好み、'COMMENT'私たちが使用。マクロプロセッサを使用して、これらを引用符で囲まれていないバージョンに置き換えます)。
AAT

10

MediaWiki wikitextを言語とみなすかどうかはわかりませんが、スペースを含む名前は間違いなく慣用的です:

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

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

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


2
wikitextは確かに正式な言語ですが、プログラミング言語とは呼びません(ループもありません)。
svick

@svick:どちらハスケル、Smalltalkの、スキーム、Clojureの、アーラン、ラムダ計算、チューリング機械、Ioは、行いませんIoke、SEPH、...
イェルクWミッターク

@JörgWMittagですが、再帰がありますが、これはループを表現するための単なる別の方法です。ウィキテキストにはそれさえありません。
svick

@svickインストールした拡張機能に応じて、mediawikiマークアップでいくつかの制御構造を取得します。特にifsと再帰を取得します。しかし、構文とパフォーマンスはかなり悪いです。テンプレートは機能とほとんど同じように動作し、その名前は本の中で識別子としてカウントされます。
CodesInChaos

1
興味深いのは、[[Wikipedia:Transclusion]]から:「現時点ではMediawikiソフトウェアに組み込まれている本当のループ機能はありません...しかしそれらを模倣するためのいくつかのトリックがあります。例えば、繰り返し呼び出すテンプレート異なるテンプレートは二重ループを模倣できます。リダイレクトを巧妙に使用することで、テンプレートを強制的に呼び出して(無限ループを防ぐために、Mediawikiソフトウェアによって通常は禁止されます)(m:Template:Loop1(backlinks、編集))m:Help:wikitextの再帰的変換も参照してください。
スティーブベネット

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

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

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

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

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

私はこれが文芸的プログラミングの人々にとって慣用的であると考えられます。多分。


Scalaでは+、メソッド名のような文字を使用できます。ので、メソッドのobj.a+=1ように解析しa+=ます。発明家のマーティン・オーデルスキーは、教科書の中で、プログラマーには通常スペースが含まれていると想定しているため、パーサーのあいまいさは実際にはそれほど問題ではありません。
ジェビンホセ

1
@aitchnyu:実際には、混合識別子では、英数字部分と演算子部分をアンダースコアで区切る必要があります。obj.a+=1同等であるobj.a += 1と同等ですobj.a.+=(1)。説明どおりに機能させたい場合に必要にobj.a_+=1なります。(実際には、解析エラーが発生します、obj.a_+=(1)またはのいずれかを呼び出す必要がありますobj a_+= 1。)
ヨルグW Mittag

それはタブではありません...それは宇宙ステーションです。また、宇宙ステーションとは、タブエスケープシーケンスを意味します。
トーマスエディング14


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

Smalltalkにはa:b:c:、起動時に空白が含まれるようなキーワードメソッドがあります。例:a: 100 b: 200 c: 300。これは、言語の標準的なイディオムです。



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

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


-1

私が現在開発しているo42aプログラミング言語は、複数語の名前をサポートしています。言語にはキーワードがまったくなく、通常、名前は記号で区切られます。まれに、2つの名前が互いに続く場合、アンダースコアを使用してそれらを区切ります。



-4

編集:この回答は正しくないことが示されました。コメントを参照してください。

私があなたの質問を正しく理解している場合、コンパイラは識別子名にスペースを許可できません。名前の重複を引き起こす可能性があるためです(区切り文字を使用しない限り)。例えば:

int my = 0; bool my count = false; int count = 0; if(my Count)...

「my count」という用語は混乱を招き、「my count」という変数を参照するか、開発者がmyとcountの間に>などの関係演算子を記述するのを忘れている可能性があります。

COBOLでは、部門名とセクション名をスペースで区切ることができましたが、それらは質問のような識別子や変数ではありません。


4
まあ、それはコンパイラではなく、言語定義です。ほとんどの言語では、あいまいさが生じるため、識別子に空白を使用できません。
スティーブベネット

2
あなたの推論は、私にはちょっと不確かに思えます。あなたの例ではmy Count、変数名であることに代わる唯一の選択肢は、タイプミスをしたプログラマーでしょう。それは曖昧さではありません。式を解析する別の有効な方法があれば、あいまいさになるでしょう。同じ理由でa(b+c)、プログラマーが忘れて>本当に意味があるので、許可するのは曖昧だと言うことができますa > (b + c)
sepp2k

1
しかし(変数名にスペースを許可する言語では)にもあいまいさはありませんif (my count)。その文を解析するための別の有効な方法があると言っているのではありません(これはあいまいなことを意味します)。文字を追加<すると、別の有効な解析になると言っています。また、キャラクター<を追加a(b+c)すると、別の有効な解析になります。
sepp2k

1
@SteveBennettそうですね。変数名にスペースを許可する言語は、型名でスペースを許可しないか、型宣言に別の構文(sayなどvar name of the variable : type of the variable)を使用するか、型宣言をまったく使用しない必要があります。
sepp2k

1
@ sepp2k、今あなたのポイントを得ました。それを明確にするために時間を割いていただきありがとうございます。私の答えは間違っています。
-NoChance
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.