/ / W Lisp, ile wejść może mieć funkcja +? - seplenienie, wspólny seplenienie

W Lisp, ile wejść może mieć funkcja +? - seplenienie, wspólne seplenienie

Jestem stosunkowo nowy w Lisp i zastanawiałem się, czy naprawdę istnieje górna granica funkcji „+”.

(Chyba dotyczy to wszystkich innych funkcji arytmetycznych „-”, „/” itd.)

Odpowiedzi:

11 dla odpowiedzi nr 1

Tak, istnieje górna granica, ale dokładna górnalimit zależy od implementacji. Masz gwarancję, że będziesz w stanie przekazać co najmniej 50, ale to wszystko zależy. (reduce #"+ list), powinno to zapewnić znacznie lepszą skalowalność niż jakakolwiek inna metoda.

Common Lisp HyperSpec ma więcej informacji.

Jeśli chodzi o zakresy wartości, są dwaróżne przypadki, pływaki i liczby całkowite. Pływaki są z natury ograniczone przez ich rozmiar, a implementacja, która zmieniła się z pojedynczych pływaków w podwójne pływaki, bardzo by mnie zaskoczyła. Z liczbami całkowitymi i wymiernymi, CL płynnie przechodzi między fixnums i bignums, więc limit jest funkcją użytecznej przestrzeni adresowej dostępnej dla implementacji. Podejrzewam, że to samo dotyczy liczb zespolonych (złożone liczby całkowite i wymierne -> w razie potrzeby przechodzą do bignum; złożone pływaki -> sygnalizują brak zasięgu lub zwracają Inf lub NaN).


8 dla odpowiedzi № 2

Common Lisp został zdefiniowany w taki sposób, żemoże być skutecznie wdrożony na wielu różnych systemach sprzętowych i programowych. Przykładami są procesory takie jak Motorola 68000/20/30/40, różne procesory Intel x86, oparte na stosie procesory Lisp Machine, DEC VAX, procesory RISC, superkomputery jak te z Cray. W latach 80. konkurowało wiele rodzin procesorów, w tym procesory opracowane do wykonywania kodu Lisp. Dzisiaj nadal mamy kilka rodzin procesorów (x86, x86-64, ARM, SPARC, POWER, PowerPC, ...).

Może być również skompilowany do C, Scheme lub innych języków programowania.

Może być również skompilowany do maszyn wirtualnych takich jak CMUCL, CLISP lub wirtualna maszyna JVM / Java (wirtualna maszyna Java wydaje się mieć limit 254 argumentów).

Na przykład kompilator Common Lisp może się skompilowaćKod Lisp do prostego kodu C. Byłoby więc dobrze, gdyby jak najwięcej funkcji wywoływania kompilatora C mogło być ponownie wykorzystane. Zwłaszcza w celu ułatwienia wywoływania Lisp z C.

C / C ++ ma na to również ograniczenia:

Maksymalna liczba parametrów w deklaracji funkcji

Powyżej podaje liczby takie jak 127 (C) i 256 dla C ++. Tak więc dla kompilatora Lisp-C mogą to być ograniczenia. W przeciwnym razie kod Lisp nie użyje wywołania funkcji C.

Pierwszy taki kompilator KCL (Kyoto Common Lisp, później ta implementacja ewoluowała do GCL / GNU Common Lisp i ECL / Embeddable Common Lisp) miał CALL-ARGUMENTS-LIMIT z 64.

Na przykład 64-bitowa implementacja LispWorks / Mac OS X ma wartość 2047 dla CALL-ARGUMENTS-LIMIT.

CALL-ARGUMENTS-LIMIT nie powinna być mniejsza niż 50.

Tak więc w Common Lisp przetwarzanie listy i wywoływanieargumenty nie są powiązane. Jeśli chcesz przetwarzać listy, musisz użyć narzędzi do przetwarzania listy (LISTA, MAPCAR, APPEND, REDUCE, ...). Common Lisp zapewnia mechanizm dostępu do argumentów jako listy za pomocą &RESTparametr. Zwykle powinno się tego unikać, ponieważ może to spowodować narzut wywołania funkcji, ponieważ lista argumentów musi zostać podana.


2 dla odpowiedzi nr 3

Clojure stanowi przykład Lisp, w którym możesz mieć nieskończoną liczbę argumentów do funkcji, poprzez użycie leniwych sekwencji:

; infinite lazy sequence of natural numbers
(def naturals (iterate inc 1))

(take 10 naturals)
=> (1 2 3 4 5 6 7 8 9 10)

; add up all the natural numbers
(apply + naturals)
=> ...... [doesn"t terminate]

Nie jest szczególnie przydatny, oczywiście .....


2 dla odpowiedzi № 4

To zależy od implementacji. „Sugerowałbym, że użytkownicy LISP-a potrzebują 5 minut na przetestowanie swojej platformy”.

Dla Clojure

(defn find-max-n [n]
(try
(eval (concat (list +) (take n (repeat 1))))
(println "more than" n)
; return n if something goes wrong
(catch Exception e n))
(recur (* n 2)))


(find-max-n 1)

Nie kończy się, zawiesza się na 8192, biorąc pod uwagę moje ustawienia.

more than 1
more than 2
more than 4
more than 8
more than 16
more than 32
more than 64
more than 128
more than 256
more than 512
more than 1024
more than 2048
more than 4096
more than 8192

-1 dla odpowiedzi № 5

Prosta odpowiedź, nie, chociaż słaba implementacja za pomocą rekurencji, a nie rekursja ogonowa, będzie miała limit stosu.

W zależności od implementacji + może być zaimplementowana za pomocą rekursji lub jako proste wywołanie funkcji.

Nie znam Common Lisp wystarczająco dobrze, by wiedzieć, jakie wymagania określa, ale większość implementacji, jeśli używa rekursji, użyje rekursji ogonowej i uniknie limitów stosu.

Wywołanie funkcji będzie mogło uzyskać dostęp do argumentów jako lista, więc nie ma limitu liczby argumentów, które mogą być przetwarzane.

EDYCJA: Ponieważ ktoś rzeczywiście podał odnośnik Common Lisp, wyraźnie powinna być lepsza odpowiedź, ale pomyślałem, że każda dobra implementacja automatycznie zastosuje odpowiednik (reduce #"+ arg-list) gdy dostarczono wystarczającą liczbę argumentów.