To wydaje się proste pytanie; być może jest to tak proste, że trudno znaleźć szukanie, które znajdzie odpowiedź. W Scheme (konkretnie implementacja Guilla, jeśli to robi jakąkolwiek różnicę), w jaki sposób mogę ocenić coś, co zostało cytowane?kontrolowanie oceny w schemacie (podstęp)
Oto, co próbuję zrobić.
Po prostu muszę upewnić się, że funkcja, którą definiuję, ocenia jej argumenty w określonej kolejności, ponieważ efekty uboczne powodowane przez ocenę jednego argumentu zależą od oceny innych argumentów. Jednak Scheme mówi, że argumenty można oceniać w dowolnej kolejności, więc chcę ręcznie wymusić je, cytując argumenty, a następnie ręcznie je oceniając w żądanej kolejności.
Wydaje się, że „eval” jest powinien robić to, co chcę, ale to ma dwa problemy:
- Jego użycie jest zalecane, więc czuję się jak nie powinno być lepszym sposobem, aby osiągnąć to, co Chcę tu zrobić.
- W schemacie okazuje się, że eval przyjmuje drugi parametr, którym jest środowisko. To mnie myli. Chcę, żeby to było w tym samym środowisku, w którym pojawia się instrukcja, dlaczego więc potrzebowałem drugiego parametru? Czy to możliwe? Grałem trochę z evalem i wydaje się, że niektóre implementacje wymagają innych parametrów (np. Mit-scheme nie wie nawet co to jest (interakcja-środowisko) !!!)
Próbowałem innych sztuczek , jak budowanie lambda:
(list 'lambda '() '(car (b c)))
, ale wydaje się, że musiałoby to zostać ocenione w celu wygenerowania procedury. Próbowałem również:
(list lambda '() '(car (b c)))
ale to zwraca „prymitywny-wbudowaną-makro”, który nie działa.
Edit: Wygląda makro zadziała na kolejność oceny kontroli: (defmacro test1 (ab) `(początek, B, A))
Jak działa makro, jeśli potrzebuję zmiennej liczby argumentów? '(defmacro test1 (a. b) \' (begin, b, a)) 'nie działa, ponieważ b jest teraz listą. Muszę jakoś splatać go na początku, ale różne próby takie jak '\' (rozpocząć (jeśli (para?, B) (test1, b)), a)) nie działają. – Michael
również, nie mogę użyć '(defmacro test1 (a. B) \' (begin (apply begin, b), a)) 'ponieważ nie mogę zastosować makra. – Michael
ten, którego przegapiłeś, to '(test defmacro1 (a. B) \' (begin, (cons 'begin b), a)) ' –