Wpis z mikrobloga

Mirki spod tagów #lisp i #commonlisp !
Jak mogę zdefiniować makro z kilkoma słowami kluczowymi? Przykładowe wywołanie:

(repeat (print i) until (< i 3))
Gdzie repeat i until to właśnie te "słowa kluczowe". Normalnie znalazłbym sobie o tym w necie, ale nie wiem co wpisać w google.

  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@copychef: odpowiem nie wprost: nie lepiej skorzystać z LOOP w tym konkretnym przypadku?

(loop until (< i 3) do (print i))
tylko w tej pętli nie modyfikujesz w ogóle zmiennej i, więc pętla albo nie wykona się ani razu, albo nigdy się nie zatrzyma.

czy na pewno chciałeś spytać o definiowanie makr?
  • Odpowiedz
@phoe: Tak, chciałem spytać o definiowanie makr.

Wiem, że nie modyfikuję. Potrzebowałem tylko szybki przykład wywołania, ale faktycznie powinna być tam dekrementacja (oraz zdefiniowanie zmiennej i przed wywołaniem samego makra).
  • Odpowiedz
@copychef: ogólnie przy deklarowaniu makr z wieloma "keywordami", tak jak LOOP, musisz je sobie sam sparsować wewnątrz ciała makra. to, co mu podajesz, to nie są jakieś magicznie zdefiniowane keywordy - to są po prostu kolejne formy lispowe, w tym przypadku symbole. zauważ, że sygnatura makra LOOP to jest (loop &rest keywords) - maszyneria wewnątrz LOOPa bierze wszystko, co użytkownik podaje mu na wejście, i przekształca na zoptymalizowany kod wynikowy.
  • Odpowiedz
@copychef: nie używaj tego w *żadnym* kodzie, który kiedykolwiek będzie czytać inna osoba. wynajdowanie od nowa tak standardowych konstruktów, jak LOOP, to oznaka złego stylu.

(loop for i from 0 below 5 do (print i)) <- skorzystaj raczej z tego.
  • Odpowiedz
@phoe: Tak jak mówiem: potrzebowałem się jedynie dowiedzieć o tym aspekcie definiowania makr. To, że akurat użyłem jako przykład (repeat ... until ...) to czysty przypadek. :)
  • Odpowiedz
@copychef: okej. ( ͡° ͜ʖ ͡°) w razie pytań wal śmiało, ewentualnie wbijaj na #lisp-pl na Freenode, tam siedzimy w całkiem sporej ilości.
  • Odpowiedz