Это похоже на простой вопрос; возможно, это так просто, что трудно найти поиск, который найдет ответ. В Scheme (в частности, реализация Guile, если это имеет значение), как я могу оценить что-то, что было процитировано?контрольная оценка по схеме (хитро)
Вот что я пытаюсь сделать.
В основном я должен гарантировать, что функция, которую я определяю, получает свои аргументы, оцениваемые в определенном порядке, потому что побочные эффекты, вызванные оценкой одного аргумента, зависят от оценки других аргументов. Тем не менее, схема говорит, что аргументы могут быть оценены в любом порядке, поэтому я хочу вручную принудительно принудительно выполнить его, указав аргументы, а затем вручную оценив их в том порядке, в котором это необходимо.
Оказывается, что «Eval» является должен делать то, что я хочу, но у него есть две проблемы:
- Его использование не рекомендуется, так что я чувствую, что должен быть лучший способ добиться того, что Я хочу здесь.
- В схеме показано, что eval принимает второй параметр, который является средой. Это меня смущает. Я хочу, чтобы он отображался в той же среде, в которой появляется оператор, поэтому зачем мне нужен второй параметр? Возможно ли это? Я играл с eval немного, и кажется, что некоторые реализации требуют разных параметров (например, mit-scheme даже не знает, что такое (среда взаимодействия) !!!)
Я пробовал другие трюки , как создание лямбда:
(list 'lambda '() '(car (b c)))
, но, похоже, это необходимо было бы оценить для создания процедуры. Я также попытался:
(list lambda '() '(car (b c)))
но это возвращает «примитивные встроенная_команда_оболочки-макро», который не работает.
Edit: Похоже макрос будет работать для контроля порядка оценки: (defmacro test1 (аb) `(начало, б, а))
Как работает макрос, если мне нужно переменное количество аргументов? '(defmacro test1 (a. b) \' (begin, b, a)) 'не работает, потому что b теперь является списком. Мне нужно как-то вставить его в начало, но различные попытки, такие как '\' (begin (if (pair?, B) (test1, b)), a)) 'не работают. – Michael
также, я не могу использовать '(defmacro test1 (a. B) \' (begin (apply begin, b), a)) ', потому что я не могу применить макрос. – Michael
тот, который вы пропустили, - '(defmacro test1 (a. B) \' (begin, (cons 'begin b), a)) ' –