Я портирование сценарий Python, чтобы Ракетка как опыт обучения, и у меня есть эта функция:Как я могу сделать этот код Racket DRYer?
(define (check-status)
(define git [find-executable-path "git"])
(define-values (ckot out in err)
(subprocess #f #f #f git "checkout" "-q" "master"))
(define-values (local lout lin lerr)
(subprocess #f #f #f git "rev-parse" "@"))
(define-values (remote rout rin rerr)
(subprocess #f #f #f git "rev-parse" "@{u}"))
(define-values (merge-base mbout mbin mberr)
(subprocess #f #f #f git "merge-base" "@" "@{u}"))
(display-lines (port->lines mbout))
(define ports '(ckot out in err local lout lin lerr remote rout rin rerr merge-base mbout mbin mberr))
(map (lambda (x)
(cond ((input-port? x) (close-input-port x))
((output-port? x) (close-output-port x)))) ports))
Проблема заключается в том, что это не очень DRY. Так как я использую Lisp, и Lisp известен тем, что в состоянии делать сумасшедшие вещи, я хочу знать, если есть способ взять весь код подпроцесс и извлечь его так, что я могу сделать что-то вроде:
(define (check-status)
(define commands '(
'("checkout" "-q" "master")
'("rev-parse" "@")
'("rev-parse" "@{u}")
'("merge-base" "@" "@{u}"))
(map currently-immaginary-git-command-fn commands))
и в итоге выведите список результатов каждой команды в списке команд. Как мне это сделать? Поскольку я новичок во всей работе Lisp/Scheme, я выясняю синтаксис, когда я иду, и я не полностью осведомлен о доступных мне ресурсах.
Это был бы хороший вопрос для [StackExchange CodeReview] (https://codereview.stackexchange.com/). –
У этого уже есть принятый ответ, хотя @Jonathan может принять его рабочий код и опубликовать его в Code Review, если он хочет, чтобы он просмотрел – Phrancis
BTW, код закрытия порта не будет работать: ''(ckot out in. ..) '- это список символов; это то же самое, что '(list 'ckot' out 'in ...)'. Вместо этого вы хотите '(list ckot out in ...)'. –