Schemat polega na prostym obejściu

Nov 09 2020

Obecnie uczę się schematu w ramach kursu, na którym się uczę. Sposób, w jaki mnie tego nauczono, polega na hojnym używaniu wyrażenia eval, a większość podanych przykładów, które testuję, nie działa zgodnie z opisem. Im więcej czytam, tym staje się oczywiste, że nie powinienem używać eval tak swobodnie. Widziałem kilka metod obejścia w javaScript, ale szukam czegoś specyficznego dla Scheme.

Ten link zawiera informacje o tym, kiedy ewaluacja może być konieczna. To nie pomaga mi znaleźć dobrej metody obejścia.

Ten link zawiera więcej dobrych informacji, ale nie daje żadnego sposobu na uniknięcie ewaluacji w mojej sytuacji.

To łącze było najbliższe odpowiedzi na moje pytanie i pomogło mi zrozumieć, dlaczego eval niekoniecznie działa zgodnie z oczekiwaniami, ale nadal nie jestem pewien, jaki byłby dobry zamiennik wyrażenia eval.

To, czego szukam, to standardowy sposób, aby to zrobić:

(define (add a_list)
    (cond
        ((null? a_list) 0)
        (eval(cons '+ a_list)))
)

(add '(3 4 8 12 30))

bez wartości eval, aby zwracała 57 . Obecnie powraca (+ 3 4 8 12 30) . Ten link wydaje się sugerować, że, powiedzmy, (+ 3 4) automatycznie zwróci się do 7, ale otrzymuję tylko listę drukowaną z powrotem jako wyrażenie bez oceny.

Będzie działać dobrze napisane w następujący sposób:

(define (add a_list)
    (cond
        ((null? a_list) 0)
        (eval(eval(cons '+ a_list))))
)

(add '(3 4 8 12 30))

zwraca 57, ale jedna z wartości evals wydaje się nic nie robić. I :

(define (add a_list)
  (eval(cons '+ a_list))
)

(add '(3 4 8 12 30))

zwraca 57, ale nie sprawdza pustej listy.

Jakakolwiek pomoc w jego całkowitym usunięciu (lub użyciu go tylko wtedy, gdy jest to absolutnie konieczne) byłaby bardzo mile widziana.

Z góry dziękuję!

Odpowiedzi

1 ÓscarLópez Nov 09 2020 at 01:28

W przypadku wymienionych przykładów nie potrzebujesz eval, proste applybędzie działać. Twoje podejrzenia są słuszne, powinniśmy unikać używania przez evalwiększość czasu - jest to uważane za „złe”.

(define (add a_list)
  (apply + a_list))