che sto porting di uno script Python per Racket come esperienza di apprendimento, e ho questa funzione:Come faccio a rendere questo codice rack 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))
Il problema è che non è molto secco. Dal momento che sto utilizzando un Lisp, e Lisp è noto per essere in grado di fare cose folli, voglio sapere se c'è un modo per prendere tutto il codice sottoprocesso ed estrarlo in modo da poter fare qualcosa di simile:
(define (check-status)
(define commands '(
'("checkout" "-q" "master")
'("rev-parse" "@")
'("rev-parse" "@{u}")
'("merge-base" "@" "@{u}"))
(map currently-immaginary-git-command-fn commands))
e termina con un elenco dell'output di ciascun comando nell'elenco di comandi. Come lo farei? Dato che sono nuovo dell'intera cosa di Lisp/Scheme, sto cercando di capire la sintassi mentre vado e non sono pienamente consapevole delle risorse a mia disposizione.
Questa sarebbe una buona domanda per [StackExchange CodeReview] (https://codereview.stackexchange.com/). –
Questo ha già una risposta accettata, anche se @Jonathan è il benvenuto a prendere il suo codice di lavoro e postarlo alla revisione del codice, se lo desidera rivedere – Phrancis
BTW, il codice di chiusura della porta non funzionerà: ''(ckot out in. ..) 'è una lista di simboli; è lo stesso di '(lista 'ckot' out 'in ...)'. Vuoi '(lista ckot out in ...)' invece. –