2016-12-04 5 views
5

Я запускаю Emacs 24.5.1 на Windows 10 и работаю через SICP. Редактор MIT Edwin не работает хорошо, особенно в Windows. Ракетка кажется хорошей альтернативой. Я установил как Racket, так и racket-mode, и все, кажется, работает нормально. Тем не менее, racket-mode настаивает на том, чтобы печатать мои результаты. Как получить его для печати в десятичной форме?Emacs: выключить довольно печатную версию в режиме ракетки

Например,

(require sicp) 

(define (square x) (* x x)) 

(define (average x y) 
    (/ (+ x y) 2)) 

(define (improve guess x) 
    (average guess (/ x guess))) 

(define (good-enough? guess x) 
    (< (abs (- (square guess) x)) 0.001)) 

(define (sqrt-iter guess x) 
    (if (good-enough? guess x) 
     guess 
     (sqrt-iter (improve guess x) 
       x))) 

Это дает результаты, такие как

> (sqrt-iter 1 2) 
577/408 

Много documentation приходит, когда я нагуглить термины «ракетку» и «довольно-печать», но я не зная об этом. Документация Racket, похоже, контролирует довольно-печатную информацию с помощью некоторой переменной, начинающейся с «pretty-print». Однако ничего не начинается с racket- или pretty в пределах M-x. Может быть, форма фракции - это не то, что Racket считает довольно-печатной?

ответ

3

Начало итерации с числами с плавающей точкой 1.0 и 2.0, а не точными цифрами 1 и 2.

Буквальной 1 читается как точное целое число, тогда как 1,0 или 1. читаются как число с плавающей точкой.

Теперь функция/работает с обоими точными неточными числами. Если вы вводите точные цифры, он производит фракцию (которая в конечном итоге заканчивается печатью в repl).

То есть вы не видите эффект красивого принтера, но фактический результат. Алгоритм работает эффективно только с номерами с плавающей запятой в качестве входных данных, поэтому вы можете добавить к функции функцию exact->inexact.

1

Это фактически намеренно и является частью стандарта Схемы (R5RS, R7RS). Он не ограничивается Racket, но должен быть выходом любого интерпретатора схемы/REPL. Это не имеет ничего общего с красивой печатью. В основном это считается хорошей вещью, поскольку она дает вам точное число (рациональное число), а не приближение с плавающей запятой. Если вы хотите получить результат с плавающей запятой, попросите его, используя 1.0, а не 1 и т. Д. В качестве альтернативы вы можете использовать функцию exact->inexact, например.

> (exact->inexact 1/3) 
0.3333333333333333 
0

Как объясняют другие ответы, оказалось, что на самом деле это не очень красивая печать.

Однако, чтобы ответить вам вопрос буквально (если вы когда-нибудь сделал хотите отключить симпатичную печать в рэкет-режиме):

Переменная Emacs является racket-pretty-print.

Вы можете просмотреть документацию об этом, используя C-h v.

Чтобы изменить его, вы можете:

  • Использование Emacs' M-х настроить UI.

  • Используйте файл (setq racket-pretty-print nil) в файле инициализации Emacs, например, в файле racket-repl-mode-hook.