3

役立つ答えが見つからないので、これを手伝ってくれる人がいることを願っています.Lispは初めてです。

私がやろうとしているのは、1 つの要素の値をテストし、1 の場合は何かを出力し、それ以外の場合は空白文字を出力することです。これは、すべてのリスト引数の値が 1 の場合に機能します。

(defun print-lst (list)
  (format t "~%~a ~a ~a~%"
          (if (= (nth 0 list) '1)
              '¦)
          (if (= (nth 1 list) '1)
              'P)
          (if (= (nth 2 list) '1)
              '¦)))

したがって、出力は¦ P ¦です。しかし、リストの2番目の要素が0の場合、その場所にNILを出力し、¦ NIL ¦代わりにスペースを出力したい¦ ¦(その文字をスキップするだけでなく¦¦、出力行のその位置に空白文字があることが重要ですテストされた値は 1 ではありません)。

条件が満たされない場合に空白文字を返す方法はありますか、(if (= (nth 1 list) '1) 'P)またはこれを実行する他の方法はありますか? うまく説明できたと思います。ありがとうございました。

4

4 に答える 4

6

の機能をフルに活用したい場合はformat、書式条件と書式 GOTO を組み合わせて使用​​できます。

このような:

[1]> (format nil "~@{~:[<nothing>~;~:*~A~]~^ ~}" 1 2 nil 4 nil 6)
"1 2 <nothing> 4 <nothing> 6"

あなたの場合、これはうまくいくはずです:

(format t "~&~@{~:[ ~;~:*~A~]~^ ~}"
        ...)

これは、次のようにすることで機能します。

  1. ~&行の先頭にいない限り、改行を挿入します。
  2. ~@{...~}引数を繰り返し処理します。
  3. ~:[...~;...~]niltheと non- nilcaseのどちらかを選択します。
  4. ~:*によって消費された引数を消費しません~:[...~]
  5. ~A処理中のアイテムを出力します。
  6. ~^最後の反復でループから脱出します (最後の項目の後に余分なスペースを出力しないようにするため)。
于 2012-04-27T16:23:27.780 に答える
5

If3つの引数を取ります:condition、then-form、else-form; else-formはオプションです。その上、私はリテラル文字にリテラル文字構文を使用します。

(if (= (nth 0 list) 1)
    #\P
    #\Space)

ドキュメンテーション:

于 2012-04-27T13:32:25.050 に答える
0

反論:
識別子 ('something) である出力値が本当に必要ですか、それとも文字列リテラルも機能しますか ("something")?

最初の場合: スペースを識別子として使用することはできないと思います。
2 番目が true の場合: "|"、"P"、および " " を出力値として使用します。

于 2012-04-27T13:49:04.007 に答える
0

フォーマットは、不注意な者をむさぼり食うのを待っている獣です

そうは言っても、ここでより高いレベルのディレクティブのいくつかを使用したいと思うかもしれません。Lisp HyperspecのFormatted Outputセクションと、 PCL の format の章を調べてください (具体的には、条件付き書式を扱うセクションを見てください)。

于 2012-04-27T14:41:59.143 に答える