Nội suy đối số nil thành `format` là chuỗi rỗng?


9

Tôi hiểu rằng điều này là tầm thường với một if, nhưng có một tùy chọn, giống như %Shoặc %snội suy nil như không có chuỗi nào cả?

Thí dụ:

(format "%?.el" nil) ; ".el"
(format "%?.el" "beginner") ; "beginner.el"

Thi thiên yêu cầu interpolationthẻ.
The Unun Cat

1
Có, nội suy chuỗi là thuật ngữ đúng để sử dụng. Đó là một biến thể về chủ đề trích dẫn / macro, trong đó các chuỗi được tạo bằng các mẫu.
wvxvw

1
Đó là một câu hỏi hay. Xem xét yêu cầu một formatchỉ số cho điều này (sử dụng M-x report-emacs-bugcho điều đó). Phần còn lại của chúng tôi đã quen với việc sử dụng concatcho việc này, đôi khi kết hợp với format(đối với các chuyển đổi khác). Hoặc khác chuyển một đối formatsố như (if something "foobar" ""), tương ứng với formatchỉ báo "%s".
Drew

2
FYI - Tôi vừa gửi yêu cầu nâng cao như vậy (# 19975), vì vậy bạn không cần phải làm vậy. (Đáng lẽ phải làm điều đó từ nhiều năm trước.)
Drew

1
Nghe có vẻ như là một cách khá mơ hồ để xây dựng một biểu thức chính quy (có thể xem xét sử dụng rxmacro trong kịch bản như vậy. Tối thiểu hãy chắc chắn rằng bạn đang sử regexp-quotedụng phù hợp), nhưng điều đó sang một bên nếu bạn có một số lượng lớn các chuỗi có thể trong LIST bạn có thể luôn luôn làm một cái gì đó như (apply 'format "%s%s%s%s" (mapcar (lambda (x) (or x "")) LIST)). Tất nhiên nếu chuỗi định dạng của bạn đúng theo nghĩa đen "%s%s%s", thì concatthực sự có ý nghĩa hơn.
phils

Câu trả lời:


8

Tùy thuộc vào ứng dụng của bạn, concatcó thể được sử dụng:

(concat "live long " nil "and prosper")
;; => "live long and prosper"

Điều này hoạt động vì concat hoạt động theo trình tự và nil là một danh sách trống.


6

Các hình thức đặc biệt orlà hữu ích ở đây. Macro này trả về giá trị của đối số thứ nhất, trừ khi nó không trả về trường hợp thứ hai. Vì vậy, giả sử biến bạn muốn kiểm tra là foo, sau đây sẽ làm những gì bạn muốn:

(format "%s.el" (or foo ""))

Trong một số cách, nó tốt hơn một thẻ ma thuật vì nó cho thấy rõ giá trị nào sẽ được trả về nếu đối số là không.



1
Đủ công bằng. Điểm quan trọng ở đây là nó không phải là một chức năng mặc dù (đó là ngắn mạch). Ví dụ của tôi đủ để nó không tạo ra bất kỳ sự khác biệt nào, nhưng nếu đối số thứ hai có tác dụng phụ, thì nó lại khác.
Elias Mårtenson

Vâng, đó là một hình thức đặc biệt. :-)
Malabarba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.