Twierdzenie, że Schemat nie ma numeru eval
, jest niedokładne przynajmniej dla najnowszych wersji standardu Scheme (R5RS i późniejszych). Zwykle jest to makro, które generuje kod w czasie kompilacji.
To prawda, że należy unikać eval
. Na początek, nigdy nie widziałem zadowalającej definicji tego, jak powinien się zachowywać, na przykład:
- Jakich wyrażeń środowiska należy oceniać, gdy nie przekazuje się środowiska?
- Po przejściu w środowisku, jak one działają? Na przykład standardy nie określają sposobu, w jaki można wstępnie powiązać wartość w tym obiekcie środowiska.
To powiedziawszy, ja pracowałem z zastosowania schematu, który używa eval
do generowania kodu dynamicznie w czasie wykonywania, w przypadku gdy struktura obliczeń nie mogą być znane w czasie kompilacji. Chodziło o to, aby system Scheme do kompilował kod w czasie wykonywania ze względów wydajnościowych - a trudność polega na tym, że nie ma standardowego sposobu poinformowania systemu Scheme "o kompilacji tego kodu".
Należy również pamiętać, że eval
może stanowić ogromne zagrożenie bezpieczeństwa. Nigdy nie powinieneś nigdy dodawać niczego, co nie ma ogromnej ściany oddzielenia od danych wprowadzanych przez użytkownika. Zasadniczo, jeśli chcesz bezpiecznie używać eval
, powinieneś to zrobić w kontekście fazy generowania kodu systemu podobnego do kompilatora, po tym, jak przeanalizowałeś niektóre dane wejściowe (używając wszechstronnie zdefiniowanej gramatyki!).
Przykro mi, nie mogłem być bardziej szczegółowy o tym, co chciałem w pytaniu. Ale co ciekawe, zawsze uważałem, że eval zawsze był integralną częścią Schematu. W każdym razie mam nadzieję, że zobaczę więcej użycia i "nadużyć" eval w CS G111. :) – unj2
Tak, 'eval' * jest * integralną częścią schematu, ale jest naprawdę potrzebny tylko w zaawansowanych przypadkach. Zasada jest taka: jeśli nie znasz przyczyn technicznych, które wymagają użycia 'eval', to * nie musisz tego * potrzebować. (A to jest poważna odpowiedź!) W każdym razie, tak, będziesz miał dużo "ewaluacji" w CSG111, jeśli masz zamiar wziąć to, i mam nadzieję, jeśli pamiętasz, zapytaj mnie o to. –