1

私はLispの初心者であり、progフォームがどのように機能するかを段階的に説明してくれる人が必要です。l1の初期値はいくつですか?なし?

リストの最初のレベルに偶数の要素がある場合、問題はTを出力し、そうでない場合はnilを出力します。

(defun nr_par (l)
  (prog ((l1 l))
    ciclu
    (cond
      ((null l1) (return T))
      ((null (cdr l1)) (return NIL))
      ((null (cddr l1)) (return T))
      (T (setf l1 (cddr l1))
         (go ciclu)))))

コンソールの場合:

(nr_par '(1 2 3 4 5 6 7 8))

T
4

3 に答える 3

6

このプログラムは簡単ですが、あまり慣用的な Lisp ではありません (機能的ではなく、むしろ必須です)。ステップバイステップは次のようになります。

prog一連の変数バインディングを使用します。この場合、初期l1値が割り当てられます。l次に、ループが開始する一連のステートメント (繰り返しますが、Lisp の慣用句ではありません)。

このタイプのループでは、タグ ( ciclu) と goto 命令 ( go) が使用されますが、推奨されませんが、使用されています。その後cond、一連のケースをチェックします。リストが空 ( null) の場合は true を返します。それ以外の場合は、長さが偶数か奇数かを確認し、結果として値を返します。

リストが 1 つまたは 2 つの要素よりも長い場合 (どちらの場合も null ではない)、リストはそれ自体 (関数)l1の次の要素の次を指すように調整されます。cddr

最後に、go関数はプログラムをcicluタグに戻します。

condいずれかの句が満たされると、プログラムは終了し、Tまたはを返しますNIL

于 2013-01-13T14:36:45.527 に答える
2

CLHS の PROG を参照してください: L1is varLis init-formであるため、 の初期値L1は の値ですL

于 2013-01-13T14:28:21.753 に答える
1

CLHS のページにあるprogように、次の3 つのことを行います。ローカル変数を取得して初期化できます。のようにタグを付けて使用できtagbodyますgo。名前付きreturnの内部で asを使用できます:blockNIL

(defun nr_par (l)                     
  (prog ((l1 l))                           ; local binding(s)
    ciclu                             
    (if (null l1)       (return T))        ; return
    (if (null (cdr l1)) (return NIL)) 
    (setf l1 (cddr l1))  
    (go ciclu)))                           ; go

(defun nr_par1 (l)                         ; directly equivalent
  (labels ((ciclu (l1) 
             (if (null l1)       (return-from ciclu T)) 
             (if (null (cdr l1)) (return-from ciclu NIL)) 
             (ciclu (cddr l1))))
    (ciclu l)))

(defun nr_par2 (l)                         ; also equivalent
  (do ((l1 l (cddr l1)))
      (NIL)                                ; while T ...
    (cond
      ((null l1)       (return T))
      ((null (cdr l1)) (return NIL)))))

結局、関数呼び出しは美化さgotoれていますね。

いくつかの相互再帰関数を手動でコンパイルして多数のステートメントを含む例については、Lisp の最長減少シーケンスも参照してください。progGO

于 2013-01-20T15:58:25.680 に答える