4

私はCommonLispにこの関連リストを持っています:

(defvar base-list (list (cons 'a 0) (cons 2 'c)))

assoc引数がタイプの場合は呼び出す必要がありstringます。

ペアの場合は(A . 0)「a」を記号に(2 . C)変換する必要があり、ペアの場合は「2」を記号に変換する必要があります。どうやってやるの?

これは次のように機能するはずです。

CL-USER 28 : 1 > (assoc (convert-string-to-symbol "a") base-list)
(A . 0)
CL-USER 28 : 1 > (assoc (convert-number-to-symbol "2") base-list)
(2 . C)

私は使ってみinternましたが、得ましたNIL

CL-USER 29 : 1 > (assoc (intern "a") base-list)
NIL
4

2 に答える 2

13

必要な関数は次のように呼び出されread-from-stringます。

CL-USER> (read-from-string "a")
A
1
CL-USER> (read-from-string "2")
2
1
CL-USER> 

ほとんどの実装では、数値を表す文字列( "2"など)の使用に基づくソリューションinternまたは機能しないことに注意してください。find-symbol

于 2018-01-31T04:11:31.063 に答える
4

あなたは親密でしたintern; あなたはただ事件を間違えました。これを試して:

> (assoc (intern "A") base-list)
(A . 0)

ここでは、name-as-stringが大文字になっていることに注意してください。

find-symbolまたは、名前で既存のシンボルを検索するために使用することもできます。

> (assoc (find-symbol "A") base-list)
(A . 0)

ここで重要なのは、元のdefvarフォームを作成したときに、リーダーが文字列「a」を読み取り、現在の読み取り可能な大文字小文字のおかげで記号名を大文字に変換したことです。大文字と小文字が異なる名前の記号は等しくありません。たまたま、読み取り時に、読者があなたが書いたもの(小文字)を他の何か(大文字)に投影していることが起こります。

readtable-case次の関数を使用して、現在のリーダーの現在のケース変換ポリシーを検査できます。

> (readtable-case *readtable*)
:UPCASE

読み取り可能なケースとリーダーがどのように相互作用するかについて詳しくは、Hyperspecのセクション23.1.2の説明を参照してください。

于 2012-06-17T13:44:27.853 に答える