はじめに:私は現在、LISPで教えられていると思われる凝縮コースを取っています。私はLISPで一生働いたことがないので、週末。私は深刻なコードについて事前に謝罪します。私は、LISPの構文を使ってコードを動作させるだけで十分です。Common LISP(SBCL):ループ内の値を返す
私は現在、地図の色の問題を解決するプログラムに取り組んでいます。このコードは、各サブシーケンスの最初の要素が状態であり、2番目の要素が色を表すシーケンスをとります。 (制約リストによって定義される)状態と同じ色を持つ状態がないことを確認するためにチェックする。おそらくこれを行うにはもっとクリーンでシンプルな方法がたくさんあると思いますが、私が現在苦労しているのは、if文が満たされるたびに、dolistループに値Tが返されることです。これまで私は単純に値を返す関数を得ることができず、変数をtrueに設定してコードを動作させるためにループが終了するのを待っている、この醜い/間違った方法に頼らざるを得ませんでした。私はリターンを使用して、if文の中にTを持たせようとしましたが、どちらの場合もループは値を返すのではなく終了し、理由はわかりません。
(setq constraint '((A (B C E)) (B (A E F)) (C (A E F)) (D (F)) (E (A B C F)) (F (B C D E))))
(defun check_constraint (f s)
(setf ans nil)
(dolist (state constraint)
(if (eq (first state) f)
(if (search (list s) (second state))
(setf ans T) ;;where I want it to just return T
)
)
)
ans
)
;;ex: ((A R) (B R) (C B) (D R) (E B) (F G))
(defun check_conflict (lst)
(setf anb nil)
(dolist (state lst)
(dolist (neighbor (remove state lst))
(if (check_constraint (first state) (first neighbor))
(if (eq (second state) (second neighbor))
(setf anb T)) ;;where I want it to just return T
)
)
)
anb
)
編集:私は再帰でこれを修正しました。コードは今よりクリーンですが、私はまだ私の問題が何であるか知りたいです。これは再帰的なコードです。
(setq constraint '((A (B C E)) (B (A E F)) (C (A E F)) (D (F)) (E (A B C F)) (F (B C D E))))
(defun check_constraint (lst f s)
(COND
((null lst) nil)
((search (list (car (car lst))) f)
(if (search s (second (car lst))) T))
(t (check_constraint (cdr lst) f s))
)
)
(defun check_neighbor (check lst)
(COND
((null lst) nil)
((check_constraint constraint (list (car check)) (list (first (first lst))))
(if (eq (second check) (second (car lst))) T))
(t (check_neighbor check (cdr lst)))
)
)
;;(check_state '((A R) (B R) (C B) (D R) (E B) (F G)))
(defun check_state (lst)
(COND
((null lst) nil)
((check_neighbor (car lst) (cdr lst)) T)
(t (check_state (cdr lst)))
)
)
多くのLisp方言がありますが、あなたはそのことを言いません。ほとんどの方言では、いくつかのより高いレベルのフォームから値を返すために使用することができる特殊な形式 'return'あります。残念ながら、それが適用される形式は、方言間で異なるものの1つです。その時点で '(return T)'を使うことは、私が知っている方言のほとんどで動作するでしょう。そして、あなたは '' ans''と '' anb''を使い捨てて、ループの後に '' NIL''を置くことができます。 – MAP
@MAPそれは普通のリスプだし、それを試みて、私はそれをSBCLで動作させることができませんでした。 – Metasyntactic