Вам не нужно определять primitive-apply
. Это происходит от языка, который вы используете для реализации оценщика.
В случае, если вы работаете с метакруглым оценщиком, primitive-apply
входит в систему схем, которую вы используете (например, mit-схема, guile , et c предоставляет вам apply
). В случае, если вы реализуете язык на каком-то другом языке, кроме схемы, такой как C, primitive-apply
записывается в C.
Например, если вы добавите 2 числа на целевом языке, чтобы использовать оператор +
из C для вычисления результата, primitive-apply
необходимо прежде всего преобразовать представление чисел целевой язык в C -подобном представлении и после этого применить примитив +
(из C) и преобразовать результат обратно в целевой язык. Этот результат будет возвращен на целевом языке primitive-apply
.
Идея состоит в том, что реализация языка, сделанная в C, будет знать представление объектов на целевом языке и сможет конвертировать это представление к аналогичному представлению, которое будет распознаваться кодом C (попробуйте посмотреть, как большие числа реализованы в некоторой реализации и что происходит внутри, когда вы добавляете 2 больших числа с реализацией, которая использует gmp Lib). Посмотрите, например, как gmp реализован в emacs lisp, что происходит, когда вы оцениваете (+ a b)
в emacs / gnu ...
Вам нужно определить только функцию apply
в целевой язык, который вы реализуете.
С другой стороны, я не понимаю, почему вы объединили вопрос с проблемой с различными реализациями конструктора для списков.