İsteğe bağlı parametre varsayılanları


26

Emacs Lisp, isteğe bağlı olmayan parametrelerin sıfır olmayan varsayılanları için sözdizimsel desteğe sahip değildir. Bu parametreleri sağlamak için önerilen deyim nedir?

Amacımı açıklığa kavuşturmak için, işte bunu yapmanın çok açık bir yolu.

(defun command (a &optional supplied-b)
  (let ((b (or supplied-b default-b)))
    (command-body a b)))

Bir şey varsa, önerilen tarz nedir?

Yanıtlar:


24

@Legoscia tarafından önerilen Common Lisp uzantılarını kullanmadığınız sürece, isteğe bağlı bağımsız değişkenin belirtilip belirtilmediğini kontrol etmeniz gerekir. letBurada gerçekten kullanmanız gerekmediğini unutmayın . Bu bana daha aptalca geliyor:

(defun command (a &optional b)
  (or b (setq b default))
  (command-body a b))

Yorumlarda önerildiği gibi, unlesskullanımı tercih edilebilir or:

(defun command (a &optional b)
  (unless b (setq b default))
  (command-body a b))

Yorumlardan ayrıca: letasıl soruda olduğu gibi daha saf fonksiyonel stil kullanmak olacaktır , ancak ayrı değişken isimlerine ihtiyaç duymazsınız:

(defun my-command (a &optional b)
  (let ((b (or b default)))
    (command-body a b)))

Tabii ki, isteğe bağlı parametre sadece bir kez gerekliyse, sadece şunu yapmanız gerekir:

(defun my-command (a &optional b)
    (command-body a (or b default)))

7
-1: Gibi setq"saf" bir boolean biçimde olduğu gibi yan etkileyici bir ifade kullanmanın iyi bir tarz olduğunu sanmıyorum or. Bence whenburada kesinlikle daha uygun olmakla birlikte, genellikle letyerel bağları kurma veya değiştirme tercihinin bir ifadesidir. ŞİMDİ, orijinal kod bana çok daha hoş görünüyor.
lunaryorn

3
Bunun gibi bir şeyin (unless b (setq b default)daha iyi olabileceği konusunda hemfikirim . Şahsen, letburada gereksiz olduğunu düşünüyorum çünkü bzaten yerel defun.
glucas

3
Bu bir zevk meselesi, ama saf kod ve saf ciltlemeyi tercih ediyorum, yani letyan etkisi olan bir form yerine setq. Varsayılan parametre parametresidir, ancak setqyerel değişkenleri değiştirmek için liberal kullanımı kodu okumayı ve takip etmeyi zorlaştırır. Bence tüm yerel bağları değişmez olarak düşünmek ve sadece yeni bağlar kurmak en iyisidir let. IOW, zorunlu olanın yerine işlevsel bir stili tercih edin.
lunaryorn

22

cl-defunİsteğe bağlı bağımsız değişkenler için varsayılan bir değer belirlemenizi sağlayan kullanabilirsiniz :

(cl-defun command (a &optional (b default-b))
  (command-body a b))

Bu durumda varsayılan değer, default-bişlev her çağrıldığında değerlendirilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.