2015-08-19 11 views
6

bir değer olarak nil ile başa çıkmak ve oldukça ... içinCL Biçim tarifi: Ben tarifleri biçimlendirme yoluyla arıyordum

(format nil CONTROL-STRING day name num-apples)

Varsayalım ı don ne arıyorum bulamıyorum Yukarıdaki formdaki argümanları değiştirmek istiyorsanız, sadece CONTROL-STRING.

day ve num-apples ve num-apples her zaman sıfır olmayacaktır, ancak name sıfır olabilir. name nil olduğunda

, ben çıkış

"Today is Monday. Hello, you have 3 apples."

ama name tanımlandığında, bunu Yani

"Today is Monday. Hello Adam, you have 3 apples."

kontrol dizesi gibi bakmak istiyorum benzemek istiyorum name bakmak gerekir, nil olmayan durumda kullanmayın, nil durumda kullanmayın, ama her iki durumda da tüketin.

Belki nil ve "" olarak yazdırarak yapılabilir? Eğer öyleyse bunu nasıl yapacağımı bilmiyorum.

+1

Özgün arama-azım yeterince iyi değildi. Bunun cevabım olduğunu düşünüyorum. http://stackoverflow.com/questions/5729032/lisp-format-directive-that-interprets-nil-argument-to-empty-string-instead-of-n?rq=1 –

cevap

9

Bağlantı kurduğunuz soru, Lisp format directive that interprets nil argument to empty string instead of "NIL", bunu nasıl yapabileceğinizi gösteren bir yanıt içerir, ancak belgelerin hiçbirinden alıntı yapılmaz. İngilizce metin oluşturduğunuz için, göz önünde bulundurmak isteyebileceğiniz birkaç seçenek daha vardır. @~ ile

Birincisi, [bunun sonucunda ~], sen tüketilen değildir sadece argüman olmayan nil olduğu durumda izleyen biçimi yönergesini ve [@~ için argüman işleyebilir Bu yüzden hala müsait. Genelde, 22.3.7.2 Tilde Left-Bracket: Conditional Expression birçok seçenek açıklar, ama yaklaşık ~ @ [ diyor:

~ [izleyen ~] argüman test @. Bu doğruysa, argümanı, [[komutu] tarafından kullanılmaz, ancak işlenecek olan olmak üzere bir sonraki öğe olarak kalır ve sonuçtaki tek öğe işlenir. Arg, false ise, argüman kullanılır ve yan tümce işlenmez. Bu nedenle, yan tümce, normal olarak tam olarak bir bağımsız değişken kullanmalı ve , sıfır olmayan olmasını bekleyebilir. aşağıdaki gibi

Bunu kullanabilirsiniz:

(defun test (day name n-apples) 
    (format nil "Today is ~a. He[email protected][ ~a~], you have ~a apples." 
      day name n-apples)) 

CL-USER> (test 'monday 'adam 2) 
"Today is MONDAY. Hello ADAM, you have 2 apples." 
CL-USER> (test 'tuesday nil 42) 
"Today is TUESDAY. Hello, you have 42 apples." 

bu da daha sağlam, sen ~p for pluralization kullanmayı düşünmelisiniz yapmak için, "get "1 elma" ve böylece 3 elma s ".Metin elde edip beri

(defun test (day name n-apples) 
    (format nil "Today is ~a. [email protected][ ~a~], you have ~a apple~:P." 
      day name n-apples)) 

CL-USER> (test 'monday 'john 2) 
"Today is MONDAY. Hello JOHN, you have 2 apples." 
CL-USER> (test 'tuesday 'john 1) 
"Today is TUESDAY. Hello JOHN, you have 1 apple." 
CL-USER> (test 'wednesday nil 0) 
"Today is WEDNESDAY. Hello, you have 0 apples." 

Son olarak, bazı vaka normalleştirme (örneğin ilk başkentleri ile uygun isimler yazdırmak) takdir ve metinde sayıda yazma olabilir:

(defun test (day name n-apples) 
    (format nil "Today is ~:(~a~). [email protected][ ~:(~a~)~], you have ~r apple~:P." 
      day name n-apples)) 
CL-USER> (list 
      (test 'monday 'adam 4) 
      (test 'tuesday 'john 1) 
      (test 'wednesday 'mary\ sue 42) 
      (test 'thursday 'jim-bob 0)) 
("Today is Monday. Hello Adam, you have four apples." 
"Today is Tuesday. Hello John, you have one apple." 
"Today is Wednesday. Hello Mary Sue, you have forty-two apples." 
"Today is Thursday. Hello Jim-Bob, you have zero apples.")