2012-06-05 3 views
2

Я смотрю схему (Dr-Scheme), идущую от Clojure.Схема эквивалента функции печати в Clojure

В Clojure я могу типа

(print 'a 'b 'c) 

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

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

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

+0

'fold' значения в одном строка путем конкатенации с пробелом между каждым словом и печать вызова? – Ankur

+1

(Если вы смотрите на «DrScheme», то вы смотрите на устаревшее программное обеспечение ...) –

+0

DrScheme устарел? Возможно, вы имеете в виду, что активная поддержка сообщества перешла на DrRacket. Вероятно, большинство интересных текстов на Схеме либо во времена DrScheme, либо до него - но я бы не назвал их устаревшими. – hawkeye

ответ

2

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

#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)) 

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

Какой прецедент для этого?

+0

Use case? Множество вещей - первое, что приходит на ум, это печатать аргументы функции. – hawkeye

+1

правильно ... поэтому вместо ввода (print arg1 arg2 arg3) вам нужно написать (print (list arg1 arg2 arg3)). Это кажется незначительной ценой, и вы получаете выгоду, а это значит, что вы можете увидеть, где заканчивается список. –

2

Возможно, вы ищете 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 
+0

Я не думаю, что это вопрос о – Ankur

+0

Возможно, вы правы. Это был комментарий «Использовать дело? Много вещей - первое, что приходит на ум, это печатать аргументы функции». что сделал соратник для отслеживания. – soegaard

+1

Привет, ребята, действительно оцениваем этот ответ - он вписывается в «вопрос, стоящий за вопросом», и я использовал это довольно много, - но иногда мне нужен какой-то «дамп аргумента середины метода», поэтому я задал вопрос сюда. Поистине оцените усилия, которые вы вложили в этот ответ, и свою задумчивость. – hawkeye

0

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

(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")))) 
+0

Wow +1 для не-ракетных зависимостей (т.е. работает в старых версиях схемы). Есть ли способ, которым мы можем просто выделить элементы списка с пробелами вместо новых строк - и просто иметь новую строку в конце? – hawkeye

Смежные вопросы