2016-03-21 14 views
0

Yapay Zeka Programlama Paradigmaları: Peter Norvig'in ortak LISP'daki vaka çalışmaları ve koşullara ilişkin özel formlar ile ilgili bölümlerde bunların hepsinin değiştirilebileceğini söylüyor. eğerLISP Koşullar İçin Özel Formlar

Eğer bunun nasıl işlediğini anlamıyorum, kimse bana açıklayabilir mi? cond formuna ne dersiniz, bu form ile de değiştirilebilir mi? when, unless, and, vb. Değiştirmek için if formuyla bir makro işlevi oluşturabilir miyim? Tek bir koşula bağlı olarak iki daldan birini seçen genel amaçlı bir koşul olan

+0

Zaten bir cevabınız var, ancak daha fazla okuma ve/veya alıştırma yapmak isterseniz, [Ortak Lisp: Nazik Anlamsal Sembolel Hesaplamaya Giriş] 'in koşullarını öneririm (http: //www.cs.cmu edu/~ DST/LispBook /). – Pascal

cevap

8

. Diğerleri, ikiden fazla dal (AND, OR, CASE) veya yalnızca bir dal (WHEN, UNLESS) olduğunda yazmanın daha kolay yoludur.

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (defun ifify-clauses (clauses) 
    (when clauses 
     (destructuring-bind (condition form) (first clauses) 
     `(if ,condition ,form ,(ifify-clauses (rest clauses))))))) 

(defmacro if-cond (&body clauses) 
    (ifify-clauses clauses)) 

(macroexpand '(if-cond 
       ((= 3 1) "foo") 
       ((= 3 2) "bar") 
       ((= 3 3) "quux"))) 
;=> (IF (= 3 1) 
;  "foo" 
;  (IF (= 3 2) 
;   "bar" 
;   (IF (= 3 3) 
;    "quux" 
;    NIL))) 
5

Bu sadece mümkün ama o cond kullanırken olan tam olarak ne var:

COND da örneğin IF ile yapılabilir size cond kullanmak ne zaman

(macroexpand '(cond ((< v 0) (print "negative") (* -2 v)) 
        ((> v 0) (print "positive") (1- (* 2 v))) 
        (t (print "zero") 0))) 
; ==> 
(if (< v 0) 
    (progn (print "negative") 
      (* -2 v)) 
    (if (> v 0) 
     (progn (print "positive") 
       (1- (* 2 v))) 
     (progn (print "zero") 
       0))) 

CL'de makro genişletme aşamasında eşdeğer if formu ile değiştirir. Bu genellikle her bir yer için bir kez olur, makro bir programda kullanılır.

Genellikle çekirdek dil, aynı şeyi yapmanın birçok yolunu desteklemez, bu nedenle uygulamanın ilkel kalması için bir neden bulamadığı sürece her şeyin if'a dönüştürüleceğini tahmin ediyorum.

CLHS, formların başlığı "Special Operator IF" ve "Macro COND" olarak yansıtır.

Koşulları gerçekleştiren kendi makrolarınızı tanımlayabilirsiniz ve artık daha fazla sol olana kadar makrolar genişlediğinden, bunların yerine koymak için mevcut olan koşullardan birini seçebilirsiniz. Sen PoAIP 53. sayfasındaki olan

(defmacro aif (p a &optional c) 
    `(let ((it ,p)) 
    (if it ,a ,c))) 

(macroexpand '(aif (extremely-expensive-function x) 
        (use-value it) 
        (compute-other-result))) 
; ==> 
(let ((it (extremely-expensive-function x))) 
    (if it 
     (use-value it) 
     (compute-other-result))) 
+2

Artı, 'cond', çok iç içe geçmiş' if 's daha kolay okunur. –

+0

@ScottM Arc, (p1 c1 p2 c2 a ise) 'yi yaparak bunu düzeltmiştir, ancak evet, diğer koşulların,' if 'yerine kullanılma nedeni olan artıları vardır. – Sylwester

1

: İşte bir anaphoric if bir tanımıdır. Eğer bu sayfayı ve bir sonraki okuyorsanız, açıklama takip eder.