識別子が何を表し、何を表していないかを理解しようとしています。
私が理解しているように、識別子はメソッド、定数、変数、クラス、パッケージ/モジュールの名前です。それは多くをカバーしています。でも何に使えないの?
識別子が何を表し、何を表していないかを理解しようとしています。
私が理解しているように、識別子はメソッド、定数、変数、クラス、パッケージ/モジュールの名前です。それは多くをカバーしています。でも何に使えないの?
ほとんどの言語では、中置算術演算に識別子を使用することはできません。
たとえば、plus
は識別子であり、という名前の関数を作成できますplus
。しかし、書くことはできます。言語の文法では識別子が許可されていないため、動作させるために名前がa = b + c;
付けられた演算子を定義する方法はありません。plus
a = b plus c;
言語ごとに、その言語で名前を付けて再利用できるエンティティ/抽象化の種類が異なります。
識別子を使用すると、後で参照できるように、一部のデータに名前を割り当てることができます。これが識別子の機能の限界です。一部のデータへの参照以外に「使用」することはできません。
とは言うものの、これから来る多くの意味がありますが、いくつかは微妙です。たとえば、ほとんどの言語では、関数はある程度データと見なされるため、関数名は識別子です。関数が値であるが「ファーストクラス」の値ではない言語では、関数の識別子を他の何かに使用できる場所で使用することはできません。一部の言語では、関数とその他のデータ用に別個の名前空間さえ存在するため、テキスト上では同じ識別子が 2 つの異なるものを参照する場合があり、それらは使用されるコンテキストによって区別されます。
通常 (つまり、ほとんどの言語で) 識別子を使用できないものの例として、言語キーワードへの参照があります。たとえば、次のようなことは通常できません。
let during = while;
during (true) { print("Hello, world."); }
複数回、またはおそらく 1 回参照したいすべてのものに使用されていると言えます (ただし、参照対象の目的を明確にするために使用します)。
名前を付けられる/付けられないものは言語ごとに異なります。多くの場合、非常に直感的です。
「匿名」エンティティとは、何らかの形で言及されているものの、名前が付けられていないものです。
#!/usr/bin/perl
$subroutine = sub { return "Anonymous subroutine returning this text"; }
Perl で言えば、これは匿名です。サブルーチンには名前が付けられていませんが、参照変数 $subroutine によって参照されます。
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にバインドされた値は同じであり、値はリテラル記号'Helloであることに注意してください。
関数をシンボルにバインドできます
[15]> (defun hello () (print 'hello))
HELLO
そしてそれを呼びます:
[16]> (hello)
HELLO
HELLO
Common lispでは、変数バインディングと関数バインディングは異なります
[19]> (setf hello 'goodbye)
GOODBYE
[20]> hello
GOODBYE
[21]> (hello)
HELLO
HELLO
ただし、SchemeまたはJavaScriptでは、バインディングは同じ名前空間にあります。
識別子がシンボルとして具体化されている場合、識別子を使用して実行できることは他にもたくさんあります。Lispで私よりも知識のある人が、あなたが「識別子ではできないこと」が存在することを示すことができるのではないかと思います。
しかし、Lispでさえ識別子スープを作ることはできません。
一種の左翼的な考えですが、JSON にはこれらすべての引用符が含まれており、JavaScript キーワードが解析を台無しにする危険性を排除しています。
その名前が示すように、識別子は何かを識別するために使用されます。そのため、一意に識別できるすべてのものに対して、識別子を使用できます。ただし、たとえばリテラル (文字列リテラルなど) は一意ではないため、識別子を使用することはできません。ただし、変数を作成して文字列リテラルを割り当てることはできます。