プロパティリスト
プロパティリストはリストと似ていますが、プロパティリストとリストはともに値のコレクションです。基本的な違いは、リストが単純な値のシーケンスであるのに対し、プロパティリストの各値はそのキー
と呼ばれる名前またはラベルで識別されるという点です。プロパティリストの操作についての詳細は、Property List Operatorsを参照してください。
例:
put {x:5,y:12} into myPropList // このプロパティリストには2つのキー、xとy、およびそれぞれに対応する2つの値、5と12が含まれています。
もう1つの違いは、あまり明らかでないかもしれませんが、それがもっと重要であるかもしれません。それは、プロパティリストがSenseTalk オブジェクト
の最も単純な形式であるということで、これはプロパティだけでなく振る舞いも持っているということを意味します。このセクションの残りの部分では、主にデータコンテナとしてのプロパティリストを説明します。オブジェクトについての完全な情報については、Objects and Messagesを参照してください。
リストとプロパティリストはパラメータとして渡すことができます。パラメータとしてリストを渡す方法については、Parameters and Resultsを参照してください。
プロパティリストの作成
プロパティリストを作成するには、各プロパティのキーと値を入力し、それを中括弧で囲みます。各プロパティのキーはその関連する値の前に来て、コロンで区切られ、キー/値のペアはカンマで区切られます。
Eggplant Functional 20.1 以前は、リストとプロパティリストの両方がデフォルトで括弧()を使用していました。それに対して、今は角括弧[]または中括弧を使用します(それぞれに対して)。括弧はまだプロパティリストの有効な構文と見なされていますが、それらの使用は混乱を招く可能性があるため、推奨されていません。
例:
put {name:"Elizabeth", age:14} into daughter
空のプロパティリストを指定するには、中括弧内にコロン{:}
を使用するか、フレーズempty object
またはempty property list
を使用します。
例:
put {:} into newPlist
プロパティリスト(それがオブジェクトであるため)は、テキストファイルで定義されたオブジェクトなど、他のオブジェクトによってhelpedすることができます。
例:
put {name:"Hank", age:47} helped by parent,actor into candidate
リストは行の続行(“\”)文字を使用せずに複数の行にまたがることができます:
set detective to {name: "Sherlock Holmes",
address: "221 B Baker Street, London",
remarks: "Enjoys playing violin, solving mysteries"}
プロパティリストは、中括弧 { } の代わりに括弧 () を使用することもできます。括弧を使用する場合、プロパティリスト全体が単一の行に表示される必要があります:
例:
put (beverage: "milk", food: "chocolate chips") into groceries
プロパティリストが通常のリストの最後のアイテムとして発生すると、プロパティリストの周囲から中括弧を省略することができます。このアプローチは、リスト/プロパティリストのハイブリッドのような構文をもたらしますが、名前付きプロパティは最後に来なければなりません。以下の2行は同等です:
例:
put [5, 12, {color:"Green", size:42}]
put [5, 12, color:"Green", size:42]
プロパティキー
すべてのプロパティ名(キー)はテキスト文字列です。プロパティ名が次の条件を満たす場合は、特別な処理をせずにキーを入力することができます。それは:(a) アルファベット文字またはアンダースコアで始まる場合、及び (b) アルファベット文字、数字、アンダースコアのみを含む場合です。スペースや特殊文字を含むキーを使用する場合、または数字で始まるキーを使用する場合は、キーを引用符で囲む必要があります。
例:
set oddPlist to {alpha:"ok", "87":"four score and seven", "$":50}
さらに柔軟性を持たせるために、括弧で囲まれた式を使用してキーを指定することもできます。この機能の最も一般的な使い方は、変数の値をキーとして単純に使用することですが、任意の式を使用することができます。
例:
if typeCode is 1 then set leaveType to "vacation" else set leaveType to "sick"
set leaveInfo to {employee:name, date:today, (leaveType):hoursTaken}
ここでは、3つのキー:"employee", "date", そして typeCode
変数の値に応じて "vacation" または "sick" を持つプロパティリストが作成されます。
重複キーと DuplicatePropertyKeyMode グローバルプロパティ
プロパティリスト内でキーが繰り返される場合、SenseTalkはduplicatePropertyKeyModeグローバルプロパティを使用して何が起こ るかを制御します。デフォルトの設定では例外がスローされます。しかし、最初または最後の値を取るように、またはすべての値をリストに追加するように値を変更することができます。
このグローバルプロパティについての詳細は、duplicatePropertyKeyMode
を参照してください。
プロパティリストの内容
リストと同様に、SenseTalkではプロパティリストに任意のタイプの値を含めることができます。これには、リストや他のプロパティリストも含まれます。
値を割り当てる際に、式を使用することができます:
例:
put {label:12592-A,
area:pi*r^2,
dimensions:[9,8,42],
color:{top:"Red", sides:"Black"} } into currentPart
プロパティリストは順序が決まっていないため、プロパティリストを表示する際、例えば log
や put
コマンドを使用すると、SenseTalkはキーをアルファベット順に表示します。
例:
set Features to {width:9 inches,ports:16,hues:4}
log Features // Displays '{hues:"4", ports:"16", width:"9 inches"}'
プロパティリスト内のプロパティへのアクセス
プロパティリスト内のプロパティにアクセスするには、いくつかの異なる方法を使用できます。ドット (.
) やアポストロフィ-S ('s
)、そして of
構文を使用すると、SenseTalkの特殊なメカニズムが起動され、これを使用して要求されたプロパティにアクセスするか、オブジェクトの関数を呼び出します。 property ... of
構文は常にプロパティにアクセスします(関数を呼び出すことはありません)。
単純なプロパティリストのプロパティにアクセスする場合、上記のそれぞれの構文の効果は同じです:それぞれが特定のプロパティにアクセスします。プロパティ名はケースに敏感ではありません。
例:
put {firstName:"Joseph", age:50} into joe
put property age of joe // 50
put the AGE of joe // 50
put joe's firstName // Joseph
put joe.firstName // Joseph
例:
log evaluateProduct(price:49.99,category:"toys",name:"lego set #12332") // 関数ハンドラー "evaluateProduct" にプロパティのリストを渡します
function evaluateProduct ProductInfo // パラメータ "ProductInfo" を持つ関数ハンドラ "evaluateProduct" を宣言します。このパラメータは渡されたプロパティリストを受け取ります。
if ProductInfo.category is "toys" or ProductInfo.category is "books"
if ProductInfo.price is greater than 20 then
return ProductInfo.Name & " は高すぎます。"
else
return ProductInfo.Name & " の価格は適切です。"
end if
else
throw "不明な製品カテゴリ。", "Category: " & ProductInfo.category
end if
end evaluateProduct
変数を使用してプロパティリストのキーを参照する
put {label:12592-A, area:pi*r^2, dimensions:[9,8,42], color:{top:"Red", sides:"Black"} } into currentPart
例:
put {firstname:"Joseph", age:50} into joe
put "Olivier" into joe.LastName
put joe —> {age:50, firstname:"Joseph", LastName:"Olivier"}
未定義のプロパティ
プロパティリストで設定されていないプロパティにアクセスすると、空が返されます。ただし、グローバルプロパティ the strictProperties
が true
に設定されている場合は例外です。the strictProperties
が true
である場合、事前に設定されていないプロパティにアクセスしようとすると例外がスローされます。 the strictProperties
のデフォルト値は false
です。
例:
put {name:"Whiskers"} into myCat
put the color of myCat // Displays nothing (empty) by default
リストとして複数のプロパティにアクセスする
キーのリストを指定することで、一度に複数のプロパティを値のリストと してアクセスすることができます:
例:
set pitch to {a:440, b:493.88, c:523.25, d:587.33, e:659.26}
put pitch's [e,d,c,d,a] // [659.26,587.33,523.25,587.33,440]
要求された順序で値を取得します:
例:
put {color:"blue",tvshow:"X-Files",hobby:"skiing",movie:"Independence Day"} into favoriteList
put favoriteList's ["hobby", "color", "movie"] // Displays the list '[skiing,blue,Independence Day]'
プロパティ値の設定または変更
プロパティリストのすべてのプロパティはコンテナーなので、SenseTalkは、put
、add
、sort
などのコンテナの内容を変更する任意のコマンドがプロパティの値を変更することを許可します:
例:
put {firstname:"Joseph", age:50} into joe
put "ine" after joe's firstName // 「Joseph」を「Josephine」に変更します
subtract 7 from the age of joe // 結果として、Joeの年齢の値は43になります
put joe --> {age:43, firstname:"Josephine"}
新しいプロパティの追加
プロパティリストに新しいプロパティを追加するには、単に存在しないプロパティに何かを格納します(値を既存のプロパティに格納すると、その現在の値が新しい値で置き換えられます)。
例:
put {firstname:"Joseph", age:50} into joe
put "Olivier" into joe.LastName
put "Tabby" into the name of joe's cat // Results in the property list '{age:"50", cat:{name:"Tabby"}, firstname:"Joseph", LastName:"Olivier"}'
SenseTalkは必要に応じてネストしたプロパティリストを自動的に作成します:
例:
put {firstname:"Joseph", age:50} into joe
put "Olivier" into joe.LastName // 'LastName' プロパティを追加します
put "Tabby" into the name of joe's cat // ネスト された 'cat' プロパティリストを作成し、その名前を「Tabby」に設定します
put joe --> {age:50, cat:{name:"Tabby"}, firstname:"Joseph", LastName:"Olivier"}
キーのリストを指定することで、一度に複数の新しいプロパティを追加できます:
例:
put {firstname:"Joseph", age:50} into joe
put "ine" after joe's firstName // Changes "Joseph" to "Josephine"
subtract 7 from the age of joe // Results in the value of joe's age being 43