LINUX.ORG.RU

Common Lisp. Рекурсивная функция внутри функции


0

0

Есть ли какой-нибудь удобный способ в Common Lisp'е внутри функции 
локально определить рекурсивную функцию так, чтобы не засорять
глобальное пространство (как это делает defun), как например в Scheme:

(define (factorial n)
  (define (fact-iter product counter max-count)
    (if (> counter max-count)
        product
        (fact-iter (* counter product)
                   (+ counter 1)
                   max-count)))

  (fact-iter 1 1 n))

labels:


(defun factorial (n)
  (labels ((fact-iter (product counter max-count)
	     (if (> counter max-count)
		 product
		 (fact-iter (* counter product)
			    (+ counter 1)
			    max-count))))
    (fact-iter 1 1 n)))

grob ★★★★★
()
Ответ на: комментарий от catap

letf не является стандартным макро, его нет в HyperSpec и некоторых реализациях - например, SBCL

grob ★★★★★
()
Ответ на: комментарий от grob

> labels А у меня работает и с вложенными defun (CMUCL). Labels же, вроде -- это для того, чтобы можно было -- по смыслу -- делать рекурсивную лямбду?

brazhe
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.