数値の次は文字を扱います。前回に引き続き配列の話がメインです。
文字列リテラル
文字列は、'
(シングルクオーテーション) で囲んで表記します。
'Hello, world!'
Hello, world!
'abc''123'''
abc'123'
'
自体を表すには、''
と書きます。改行等の特殊な文字をエスケープする方法はありません。
文字列は、文字のリストなので、ベクターと同様の機能が使えます。
a=: 'abcde'
#a
5
2 { a
c
a i. 'e'
4
文字
リテラルが ちょうど 1 文字 1 だけ含む場合、それは「文字」を表します。
'a' NB. 文字
'''' NB. 文字
'ab' NB. 文字列
'' NB. (空の) 文字列
「文字」と「文字列」の関係は、「数値」と「ベクター」の対応に似ています。
0 NB. 数値
0 1 NB. ベクター
文字を並べたものが文字列に、数値を並べたものがベクターになります。
連結
リストの連結には ,
(dyad) を使います。
'abc' , 'de'
abcde
'a' , 'bc' , 'd'
abcd
'a' , 'b'
ab
これを使うと、改行などを含めることができます。
'abc' , LF , 'de'
abc
de
,
はリストの操作なので、数値の場合も同じように使えます。
1 2 3 , 0 1
1 2 3 0 1
文字と数値
文字と数値は型が違うので、混ぜるとエラーになります。暗黙の変換が行われることもありません。
1 2 , 'ab'
|domain error
| 1 2 ,'ab'
domain error は、予期しない値が使われたことを示しています。(J でコードを書くにあたって、一番よく見るエラーだと思います。)
+
や *
を文字に対して使うこともできません。
'ab' + 'c'
|domain error
| 'ab' +'c'
'ab' * 2
|domain error
| 'ab' *2
バイト / 整数 の変換
0 以上 255 以下のバイト値が、a.
というリストに順番に格納されています。(a.
の要素の型は文字です。) これによって、文字と整数の相互変換ができます。
65 { a. NB. 整数 -> 文字
A
a. i. 'A' NB. 文字 -> 整数
65
a.
は制御文字も含んでいるので、直接中身を見ることはできません。印字可能な文字の一覧は、次のようにすれば得られます。
(32 + i.95) { a.
比較
さて、ここで比較の話をしておきます。比較には以下の verb (いずれも dyad) を使います。
-
=
~:
-
<
<:
>
>:
(数値のみ)
~:
は「等しくない」を表し、<:
と >:
はそれぞれ「以下」「以上」を意味します。それ以外は、他の言語と同じです。
1 = 1
1
1 = 0
0
'a' = 'a'
1
'a' ~: 'b'
1
0 > 1
0
1 <: 2
1
1 >: 1
1
=
と ~:
は、数値と文字とを比較することもできます 2。
1 = '1'
0
1 ~: '1'
1
リストの比較
=
をリストに対して使うと、面白い結果が得られます。
a
abcde
a = 'apple'
1 0 0 0 1
a = 'd'
0 0 0 1 0
a = 'abc'
|length error
| a ='abc'
なんと、それぞれの要素 (文字) について、比較が行われているのです。試してみれば分かりますが、ベクターでも同様です。
上に挙げた比較の verb は全て、「1 つの値」ごとに比較します。この「1 つの値」(つまり 数値や文字) のことを、アトム (atom) と呼びます。比較だけでなく +
等も、アトムに対する演算です。
アトムごと ではなく、全体を比較するには、-:
を使います。
a -: 'a'
0
a -: 'abcde'
1
配列を比較する場合は、気をつけるようにしましょう。
[ 前 : 数値の配列 (ベクター) ] [ 目次 ] [ 次 : 多次元配列 ]