1

私はLispに不慣れで、これを書く方法がわかりません...

You give: ("Test" "TEST" "third" "the last")
You get:  (("A" . "Test") ("B" . "TEST") ("C" . "third") ("D" . "the last"))
Function: (defun choices (&rest choices))

Cでは、これを書くことができますforが、Lispは文字列に+1することができず、ループにもカウンターがありません...誰かが私にサンプルを教えてもらえますか?

4

2 に答える 2

2

私はこのようなものを書くでしょう:

(defun  choices (&rest choices)
  (loop for i from 1 to 26
        and item in choices
        collect (cons (string (digit-char (+ 9 i) 36))
                      item)))

上記のコードには、26を超える選択肢のエラーチェックはありません(エラーでない場合は、それらの処理方法を指定していません)。

とを使用CHAR-CODECODE-CHARて「文字をインクリメント」することはできますが、それらが提供するエンコーディングは標準化されていません(その一部のプロパティのみが保証されています)。基数36ではDIGIT-CHAR、ウェイト10〜35の英語のアルファベット(大文字)を取得することが保証されています。

そしてもちろん、LOOPあなたが望むどんなカウンターも含めて、たくさんのものがあります。

于 2013-02-07T09:26:59.893 に答える
1

mapcar+cons を実行するだけで、説明した方法で 2 つのリストを連結できます。

(mapcar #'cons '("A" "B" "C" "D") '("Test" "TEST" "third" "the last"))
; => (("A" . "Test") ("B" . "TEST") ("C" . "third") ("D" . "the last"))

2 番目のリストが与えられているので、問題は ABCD リストの生成のみです。これは loop と code-char で実現できます:

(loop for i from 65 to 68 collect (string (code-char i)))
; => ("A" "B" "C" "D")

これら 2 つを答えに組み合わせて、特定の問題に合わせて調整することは、今では簡単なはずです。

于 2013-02-07T09:34:21.797 に答える