Я перепробовал всевозможные комбинации минусов и добавлений для получения '(5 . (5)) но не смог. Там в любом случае?
Схема: как произвести '(5 . (5))
Ответы (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))
и вы увидите, что это два способа записи одного и того же значения.
Не существует портативного способа неправильно напечатать правильный список. Проще всего было бы написать собственный принтер. Очень простым будет что-то вроде следующего:
(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))))
cdr
пары является правильным списком, он не печатается как пара с точками. Лучше спросить, как создать конкретную структуру, чем как получить конкретный выходной формат. - person molbdnilo   schedule 30.11.2015(list 5 5)
или(cons 5 (cons 5 '()))
, или'(5 5)
или'(5 . (5))
и т. д. Но стандартная печать всегда будет(5 5)
. - person Joshua Taylor   schedule 30.11.2015