2

素晴らしい本「LandofLisp」の例のソースコードを次に示します。

(defun random-node ()
  (1+ (random *node-num*)))

(defun edge-pair (a b)
  (unless (eql a b)
     (list (cons a b) (cons b a))))

(defun make-edge-list ()
    (apply #'append (loop repeat *edge-num*
                          collect (edge-pair (random-node) (random-node)))))

私はLispの本能を持っていないので、メソッドを複数の行に分割し(命令型として)、それを機能的なスタイルに変形させようとすると便利だと思います。

make-edge-list関数を複数の行に分割するのを手伝っていただけませんか。

4

1 に答える 1

1

Lisp では行は無意味です。Lisp 記法は s 式に基づいており、テキスト行は評価中に Lisp からは見えません。式は、空白で任意の方法で分割できます。

(defun make-edge-list ()
   (apply #'append
          (loop repeat *edge-num*
                collect (edge-pair (random-node)
                                    (random-node)))))

次のようなコードを読む必要があります。

  • 各辺のペアはコンスのリストです。各コンスには位置が格納されます。
  • ループはエッジ ペアのリストを返します。
  • 次に、このリストに追加が適用され、cons のリストが返されます。conses のリストは、実際には位置のリストです。

関数にはいくつかの小さな問題があることに注意してください。

  • APPLY は、任意の長さのリストには機能しません。リストが長すぎないことを祈りましょう。

  • さらに重要なことは、LOOP を少し変更すれば、関数 APPEND の適用は実際には必要ありません。LOOP は COLLECT だけでなく APPEND もできます。

于 2010-11-18T08:18:58.763 に答える