Схема эквивалентна функции печати в Clojure

Я смотрю на Scheme (Dr-Scheme) из Clojure.

В Clojure я могу ввести

(print 'a 'b 'c)

а функция print определяет, что это произвольное количество нестроковых аргументов, и выводит их через пробел.

В схеме функция print ожидает один аргумент.

Есть ли способ получить эквивалент функции печати Clojure в Scheme?


person hawkeye    schedule 05.06.2012    source источник
comment
fold значения в одной строке путем конкатенации с пробелом между каждым словом и вызовом print ?   -  person Ankur    schedule 05.06.2012
comment
(Если вы смотрите на DrScheme, значит, вы смотрите на устаревшее программное обеспечение...)   -  person Eli Barzilay    schedule 05.06.2012
comment
DrScheme устарел? Возможно, вы имеете в виду, что активная поддержка сообщества переместилась на DrRacket. Возможно, большинство интересных текстов по Scheme относятся либо к эпохе DrScheme, либо к ней до нее, но я бы не назвал их устаревшими.   -  person hawkeye    schedule 05.06.2012
comment
На случай, если это непонятно: DrScheme и DrRacket на самом деле одно и то же животное. Более новые версии DrScheme называются DrRacket. Извините, если вы это уже знали.   -  person John Clements    schedule 05.06.2012
comment
@hawkeye, программное обеспечение устаревает гораздо быстрее, чем книги. Но DrScheme — это особый случай — это просто более старая версия программного обеспечения, которая теперь называется по-другому.   -  person Sam Tobin-Hochstadt    schedule 05.06.2012


Ответы (3)


Интересно... вы можете довольно легко свернуть один из них, но я не уверен, что вижу в этом необходимость. Например:

#lang racket

(define (print-many . args)
  (display
   (apply
    string-append
    (add-between (map print-to-string args) " "))))

(define (print-to-string arg) (format "~v" arg))

(print-many 3 4 5 'b '(3 3 4))

В целом, однако, я думаю, что если вы генерируете вывод для пользователя, вам понадобится лучший контроль над выводом, и если вы не генерируете вывод для пользователя, вы так же счастливы похлопывая вокруг него пару скобок и превращая его в список.

Каков вариант использования для этого?

person John Clements    schedule 05.06.2012
comment
Вариант использования? Много вещей - первое, что приходит на ум, это печать аргументов функции. - person hawkeye; 05.06.2012
comment
правильно... поэтому вместо того, чтобы печатать (напечатать arg1 arg2 arg3), вы должны написать (напечатать (список arg1 arg2 arg3)). Это кажется незначительной стоимостью, но вы также получаете преимущество, заключающееся в том, что вы можете видеть, где заканчивается список. - person John Clements; 05.06.2012

Возможно, вы ищете trace ?

#lang racket

(define (foo x y)
  (+ x y))

(define (bar x)
  (+ (foo 1 x)
     (foo 2 (+ x 1))))

(require racket/trace)
(trace foo)

А затем в окне взаимодействия:

> (bar 3)

>(foo 1 3)
<4
>(foo 2 4)
<6
10
person soegaard    schedule 05.06.2012
comment
думаю вопрос не в этом - person Ankur; 05.06.2012
comment
Вы, наверное, правы. Это был этот комментарий Вариант использования? Много вещей - первое, что приходит на ум, это печать аргументов функции. что сделал партнер для отслеживания. - person soegaard; 05.06.2012
comment
Привет, ребята, очень ценю этот ответ - он действительно вписывается в вопрос, стоящий за вопросом, и я использовал его довольно часто, но иногда мне нужен был своего рода дамп аргумента промежуточного метода, поэтому я задал вопрос таким образом. Очень ценю усилия, которые вы приложили к этому ответу, и вашу внимательность. - person hawkeye; 06.06.2012

Я использую этот набор определений для печати нескольких аргументов, разделенных новой строкой:

(define (println x) (display x) (newline))
(define (printlist l) (begin
                        (println (car l))
                        (if (not (null? (cdr l))) (printlist (cdr l)))))  
(define (multiprint  . args) (begin
                                (if (not (null? args)) (printlist args) 
                                    (println "Error: multiprint requires at least one argument"))))
person Aslan986    schedule 05.06.2012
comment
Вау +1 за зависимости без рэкета (т.е. работающие в старых версиях схемы). Есть ли способ, которым мы можем просто отделить элементы списка пробелами вместо новых строк - и просто добавить новую строку в конце? - person hawkeye; 06.06.2012