Схема: как произвести '(5 . (5))

Я перепробовал всевозможные комбинации минусов и добавлений для получения '(5 . (5)) но не смог. Там в любом случае?


person Bibrak    schedule 30.11.2015    source источник
comment
Можете ли вы показать свою лучшую попытку? Таким образом, мы можем указать вам на ошибку и как ее исправить.   -  person Renzo    schedule 30.11.2015
comment
Я не могу придумать, как заставить Racket выводить именно это — если cdr пары является правильным списком, он не печатается как пара с точками. Лучше спросить, как создать конкретную структуру, чем как получить конкретный выходной формат.   -  person molbdnilo    schedule 30.11.2015
comment
Можете ли вы сказать нам, почему вам нужен список, представленный в таком виде? Какая процедура потребляет этот результат и зачем он ей нужен?   -  person Eric Clack    schedule 30.11.2015
comment
Посмотрите на этот вопрос: точечная нотация в схеме. Структура, которую вы хотите, это просто (list 5 5) или (cons 5 (cons 5 '())), или '(5 5) или '(5 . (5)) и т. д. Но стандартная печать всегда будет (5 5).   -  person Joshua Taylor    schedule 30.11.2015
comment
Да я получил его. Дело в принтере, а не во внутренней структуре.   -  person Bibrak    schedule 03.12.2015


Ответы (2)


Рискуя показаться Биллом Клинтоном, это зависит от того, что вы подразумеваете под «производством».

Если вы имеете в виду «создать значение, которое печатается на экране как '(5 . (5)), то вам немного не повезло, потому что это значение печатается как '(5 5).

Для аналогичного примера: как мне создать число 1e-1 ? Что ж, попробуйте ввести его; это то же самое, что и 0,1, и если вы наберете 1e-1, оно будет напечатано как 0,1.

Однако вы можете оценить

#lang racket
(= 0.1 1e-1)

... и вы увидите, что это одно и то же число.

Таким же образом попробуйте оценить

#lang racket
(equal? '(5 . (5)) (list 5 5))

и вы увидите, что это два способа записи одного и того же значения.

person John Clements    schedule 30.11.2015

Не существует портативного способа неправильно напечатать правильный список. Проще всего было бы написать собственный принтер. Очень простым будет что-то вроде следующего:

(define (write-dot obj . maybe-port)
  (define out (if (null? maybe-port) (current-output-port) (car maybe-port)))
  (cond ((pair? obj) 
         (display "(" out)
         (write-dot (car obj) out)
         (let loop ((obj (cdr obj)))
           (display " " out)
           (cond ((null? obj))
                 ((and (pair? obj) (null? (cdr obj)))
                  (display ". " out)
                  (write obj out))
                 ((pair? obj) (write-dot (car obj)) (loop (cdr obj)))
                 (else (write obj)))
           (display ")" out)))
        (else (write obj out))))
person Takashi Kato    schedule 30.11.2015