Я студент, завтра у меня тест, и я увидел, что в прошлом году возник такой вопрос: написать код схемы, который отличает '(a b)
от (list 'a 'b)
, без использования побочного эффекта (нет set!
, set-car!
..)
Понятия не имею, как это сделать.у кого-нибудь есть идея?
Причина, по которой есть разница, заключается в том, что '(a b)
создает статический объект в памяти, на который ссылаются.И (list 'a 'b)
- это приложение, которое создает объект динамической памяти.
Мой учитель ожидает код, который либо дает другой ответ, в соответствии с входными данными, либо тот, что один вход вызывает бесконечный цикл.
Пример кода, который использует побочные эффекты:
(define lst (lambda () '(a b)))
(set-car! (lst) 'g)
(display (lst)) (newline)
;;; prints (g b)
(define lst1 (lambda () (list 'a 'b)))
(set-car! (lst1) 'g)
(display (lst1)) (newline)
;;; prints (a b)
Причина в том, что lambda
откладывает вычисление значения, а в случае (list 'a 'b)
создание нового списка каждый раз, когда вызывается (lst1)
.
Для тех, кто жалуется, что вопрос не очень хороший: курс посвящен компиляторам, и он хочет, чтобы мы понимали, какие эффекты все имеет, до генерации кода.