-3

以下のこの関数は、リスト内の数値をチェックします。たとえば、ここでは 12 を探しています。12 があればT(true) を返し、なければ を返します NIL。構文を理解しようとしていますが、ちょっと混乱しています。このコードが何をするのか簡単な英語で説明できる人はいますか?

1> (defun an (&rest n)
    (block nil
      (setq x (car n))
      (setq n (cdr n))
      (loop (< x 100)
      (setq n (cdr n))
      (if (eq x 2) (return (eq (car n) 12))) (setq x (1- x)))))
AN
2> (an 2 3 4 5 66 7)
NIL
3> (an 2 3 12 3 4 5)
T

追加の質問: どのように機能する&restか、または何をしますか?

4

1 に答える 1

1

M-xslime-macroexpand-allSLIMEを使用している場合は、ポイントがブロックフォームの最後の括弧にあるときに実行できます。あなたはこのようなものを得るでしょう:

(BLOCK NIL
  (SETQ X (CAR N))                      ; save the first element in X, while declaring
                                        ; a special variable by that name
  (SETQ N (CDR N))                      ; set N to the second cons of the list
  (BLOCK NIL
    (TAGBODY
     #:G892
      (PROGN
       (< X 100)                        ; Useless, has no impact on your code
       (SETQ N (CDR N))                 ; set N to the third cons of the list
       (IF (EQ X 2)
           (RETURN-FROM NIL (EQ (CAR N) 12))) ; return from the innermost block NIL
                                        ; however, since there's no more code in the
                                        ; outermost block NIL, this will return from
                                        ; it too.
       (SETQ X (1- X)))                 ; decrement value in X. It may happen so by
                                        ; chance that, if initially X was larger than 2
                                        ; the above condition will trigger
      (GO #:G892))))

おそらく、あなたが何をしようとしているのかを説明すれば、あなたはより幸運になるでしょう、この関数は非常に間違っているので、この質問を懇願しています。

于 2012-10-09T15:51:35.947 に答える