2015-08-19 15 views
6

Tôi đã tìm kiếm thông qua định dạng công thức nấu ăn, và tôi không thể khá tìm những gì tôi đang tìm kiếm ...CL Format công thức: Đối phó với con số không như một giá trị

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

Giả sử tôi don không muốn thay đổi các đối số trong biểu mẫu trên, chỉ cần CONTROL-STRING.

daynum-apples sẽ luôn không phải là số không, nhưng name có thể là không.

Khi name là con số không, tôi muốn đầu ra để trông giống như

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

nhưng khi name được định nghĩa, tôi muốn nó trông giống như

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

Vì vậy, các chuỗi kiểm soát cần phải xem name, sử dụng nó trong trường hợp không phải là không, không sử dụng nó trong trường hợp nil, nhưng tiêu thụ nó trong cả hai trường hợp.

Có thể nó có thể được thực hiện bằng cách tiêu thụ nil và in dưới dạng ""? Nếu vậy tôi không biết làm thế nào để làm điều đó.

+1

Tìm kiếm ban đầu của tôi-fu không đủ tốt. Tôi nghĩ rằng điều này có câu trả lời của tôi. http://stackoverflow.com/questions/5729032/lisp-format-directive-that-interprets-nil-argument-to-empty-string-instead-of-n?rq=1 –

Trả lời

9

Câu hỏi bạn đã liên kết đến, Lisp format directive that interprets nil argument to empty string instead of "NIL", không bao gồm câu trả lời cho biết cách bạn có thể thực hiện việc này, nhưng không trích dẫn bất kỳ tài liệu nào. Vì bạn đang tạo văn bản tiếng Anh, cũng có một số tùy chọn khác mà bạn có thể muốn xem xét.

Thứ nhất, với ~ @ [hậu quả ~], bạn có thể xử lý quả chỉ thị định dạng chỉ trong trường hợp đó, lập luận là không bằng không, và lập luận để ~ @ [ không tiêu thụ , vì vậy nó vẫn có sẵn. Nói chung, 22.3.7.2 Tilde Left-Bracket: Conditional Expression mô tả nhiều lựa chọn, nhưng về ~ @ [ nó nói:

~ @ [hậu quả ~] kiểm tra đối số. Nếu nó là đúng, thì đối số không được sử dụng hết bởi lệnh ~ [nhưng vẫn giữ nguyên giá trị tiếp theo là được xử lý và hậu quả một khoản được xử lý. Nếu arg là false, thì đối số được sử dụng hết và mệnh đề không được xử lý. Điều khoản này do đó thông thường nên sử dụng chính xác một đối số và có thể mong đợi nó không phải là số không.

Bạn có thể sử dụng điều này như sau:

(defun test (day name n-apples) 
    (format nil "Today is ~a. [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." 

Để làm điều này thậm chí còn mạnh mẽ hơn, bạn nên xem xét sử dụng ~p for pluralization, do đó bạn nhận được "1 quả táo" và " 3 quả táo s ".

(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." 

Cuối cùng, vì bạn đang tạo ra văn bản, bạn có thể đánh giá cao một số bình thường trường hợp (ví dụ, in danh từ riêng với vốn ban đầu), và viết những con số trong văn bản:

(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.") 
Các vấn đề liên quan