Еквивалент на схемата на функцията за печат в Clojure

Гледам Scheme (Dr-Scheme), идваща от Clojure.

В Clojure мога да пиша

(print 'a 'b 'c)

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

В Scheme функцията 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
така... така че вместо да пишете (print arg1 arg2 arg3), трябва да пишете (print (list 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