私はidentifiersが表すものとそれらが表現していないものを理解しようとしています。識別子を使用できないものは何ですか?
私が理解しているように、識別子は、メソッド、定数、変数、クラス、パッケージ/モジュールの名前です。それは多くをカバーしています。しかし、あなたは何のためにそれを使用できませんか?
私はidentifiersが表すものとそれらが表現していないものを理解しようとしています。識別子を使用できないものは何ですか?
私が理解しているように、識別子は、メソッド、定数、変数、クラス、パッケージ/モジュールの名前です。それは多くをカバーしています。しかし、あなたは何のためにそれを使用できませんか?
という名前が意味するように、識別子は何かを識別するために使用されます。一意に識別できるすべてのものについては、識別子を使用することができます。しかし、例えばリテラル(例えば文字列リテラル)はユニークではないので、識別子を使用することはできません。ただし、変数を作成して文字列リテラルを割り当てることができます。
各言語は、エンティティ/抽象化がその言語で名前を付けて再利用できるかどうかによって異なります。
これは、複数回参照したい場合や、一度でも参照したい場合に使用します(ただし、参照先の目的を明確にするために使用します)。
名前は言語ごとに異なりますが、IMHOは非常に直感的です。
「匿名」エンティティは、何らかの方法で参照されていますが、名前が付けられていないものです。 Perlの-話すに
#!/usr/bin/perl
$subroutine = sub { return "Anonymous subroutine returning this text"; }
、これは匿名で - サブルーチンが命名されていないが、それは、参照変数$サブルーチンによって参照されます。
PS:はPerlでは、サブルーチンは次のように次のような名前になります
sub NAME_HERE {
# some code...
}
スープを作ることはむしろファウルです。
Lispなどの言語では、識別子はシンボルとして独自に存在しますが、イントロスペクティブな識別子ではない言語ではランタイムには存在しません。
あなたはそれの前に単一引用符を置くことによってリテラルの識別子/記号を書く:
[1]> 'a
A
あなたは変数を作成し、それにリテラルシンボルを割り当てることができます。
[2]> (setf a 'Hello)
HELLO
[3]> a
HELLO
[4]> (print a)
HELLO
HELLO
することができます2つの変数を同じシンボルに設定する
[10]> (setf b a)
HELLO
[11]> b
HELLO
[12]> a
HELLO
[13]> (eq b a)
T
[14]> (eq b 'Hello)
T
bとaにバインドされている値は、sam E、および値は、リテラルシンボル「こんにちは
であるあなたは、シンボル
[15]> (defun hello() (print 'hello))
HELLO
に機能を結合して、それを呼び出すことができます:Common Lispでは
[16]> (hello)
HELLO
HELLO
、変数を結合し、関数バインディングは別個である。
[19]> (setf hello 'goodbye)
GOODBYE
[20]> hello
GOODBYE
[21]> (hello)
HELLO
HELLO
しかし、SchemeまたはJavaScriptでは、バインディングは同じ名前空間にあります。
記号で修飾されている場合、識別子で行うことができる他にも多くのことがあります。私は、Lispで私より知っている誰かが、あなたが識別子の存在で行うことができないことを実証することができるだろうと思っています。
しかし、Lispでも識別子スープを作ることはできません。
識別子を使用すると、後で参照できるように、一部のデータに名前を割り当てることができます。これが識別子の限界です。一部のデータへの参照以外には使用できません。
しかし、これには多くの意味があり、微妙なものがあります。たとえば、ほとんどの言語では、関数はある程度はデータとみなされるため、関数名は識別子です。関数が値であるが「ファーストクラス」の値ではない言語では、識別子を別のものに使用できる場所で関数の識別子を使用することはできません。いくつかの言語では、関数と他のデータのために別々の名前空間が存在するため、同じ識別子が2つの異なるものを参照する可能性があり、それらは使用されるコンテキストによって区別されます。
一般的に(つまり、ほとんどの言語で)識別子を使用できない例は、言語キーワードへの参照です。左フィールド思考の
let during = while;
during (true) { print("Hello, world."); }
ソートが、JSONは、構文解析をめちゃくちゃにJavaScriptのキーワードの危険性を排除することで、これらすべての引用があります。たとえば、この種のものは、一般的に行うことはできません。
ほとんどの言語では、中置算術演算に識別子を使用できません。
たとえば、plus
は識別子で、plus
という名前の関数を作成できます。しかし、a = b + c;
と書くことができます。plus
という演算子を定義してa = b plus c;
という演算子を定義する方法はありません。なぜなら、言語文法は識別子を許可しないからです。
なぜ文字列リテラルは一意ではありませんか? –
var a = "Hello"と言うことができます。 var b = "こんにちは"; – Ender
ああはい。ありがとうございました。 –