2017-01-13 10 views
1

Для моей домашней работы, у меня есть небольшой список переводчик написанный в C с несколькими функциями уже закодированы: set, cons, car, cdr и quote.сюсюкать функция, которая не оценивает свои аргументы

И я должен добавить еще 6 функций по своему выбору. 3 с оценкой аргументов и 3 без оценки аргументов. С оценкой, я выбираю: eq, + и -1, , но у меня нет идеи для следующих 3, какая функция Lisp полезна без оценки аргументов?

+0

В Коммон Лисп, все функции оценивают свои аргументы. Если аргументы не подлежат оценке, вам нужен макрос или специальная форма, которая не оценивает его аргументы. –

+0

Возможно, вы можете реализовать 'cond', который не оценивает свои аргументы как функцию. Возможно, вы могли бы реализовать некоторые другие специальные формы для потока управления. Возможно, вы можете реализовать 'defun'. –

+1

Почему ярлык common-lisp? Вы создаете двойное пространство имен? лексически охвачен динамически охваченной областью? Я бы принял решение по этим двум вопросам, прежде чем принимать решение о том, какие специальные формы реализовать, кроме 'if', который является slam dunk. – Sylwester

ответ

4

Необходимость отсроченной оценки

Все аргументы сюсюкать functions всегда оцениваются.

Это не так для macros и special operators, один из которых, quote, вы уже реализованы.

Стандартный пример, когда отложенный оценка полезна:

(if (under-attack-p) 
    (launch-missiles) 
    (print "Peace!")) 

I аргументы if были оценены, то мы бы ...

  1. проверить ли мы под атакой
  2. printPeace!
  3. запуск ракет
  4. если бы мы были под атакой, вернуть Peace! (значение, возвращаемое print), в противном случае возвращает значение launch-missiles

Однако, специальный оператор if оценивает свой первый аргумент и решает, какие из другие два аргумента для оценки на основе этого значения.

Смотрите также How does `if` not evaluate all its arguments?

Моя рекомендация для реализации является:

  • dolist - итерация
  • if - условное
  • defun или let - переплеты