Lisp - zadanie z polem/obwodem kola

Lisp - zadanie z polem/obwodem kola
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Mam zadanie napisac w Lispie funkcje, ktora obliczy obwod kola na podstawie jego pola. Ponadto, funkcja ma zwracac pusta liste, jesli dane wejsciowe sa ujemne lub nie sa liczba. Napisalem cos takiego:

Kopiuj
(defun obwod (p)
(if (or (< p 0) (not (numberp p))) '()
(if (> p 0) (* 2 pi (sqrt (/ p pi))))
)
)

Liczy mi obwod dla dodatniej liczby, zwraca NIL dla ujemnej, ale jak podaje litere to jest blad. W drugiej linijce probuje wykorzystac "numberp", ktora zwraca prawde jesli argument jest liczba, ale nie chce zeby to byla liczba, wiec neguje, ale mimo to przy wklepywaniu np. (obwod n) wyskakuje blad z trescia ze "n nie ma wartosci" czy jakos tak. Wie ktos jak to zrobic zeby dzialalo?

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5550
4

Takie coś?

Kopiuj
(defun obwod (p)
  (if (or (not (numberp p)) (< p 0)) 
    '()
    (* 2 pi (sqrt (/ p pi)))
  )
)

(print (obwod "aa"))
Kokoniłaj
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 190
1

Samo n traktowane jest jak zmienna. Jeżeli chcesz wpisać literę to musisz zapisać ją jako 'n. Po zmianie powinien Ci wyskoczyć błąd w stylu: N is not a real number. Wystarczy zamienić kolejność parametrów w funkcji or.

https://en.wikipedia.org/wiki/Short-circuit_evaluation

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Nie wiem czego wykresliles jedno zdanie. Jak wpisuje pojedyncza litere z pojedynczym apostrofem z przodu np. 'p to dziala.

Kokoniłaj
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 190
0
Majster15 napisał(a):

Nie wiem czego wykresliles jedno zdanie. Jak wpisuje pojedyncza litere z pojedynczym apostrofem z przodu np. 'p to dziala.

Bo według mnie to było mylące. Bo powstał symbol a nie string. Jeżeli użyjemy operatora quote czyli ' to lisp zwraca argument bez ewaluowania go.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.