Как обычно делить исходный файл на несколько модулей? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть исходный файл длиной около 380 строк.Это уже далеко от точки, где трудно читать, потому что это просто большое море define с.Я хотел бы разбить его, желательно на несколько областей, а не просто вставить комментарий перед каждой группой связанных определений.Я также предпочел бы не разбивать его на отдельные исходные файлы, поскольку у меня есть несколько очень похожих исходных файлов: каждый из них представляет собой эксперимент с различным способом выполнения одной и той же вещи.Если бы я разбил каждый из них на несколько исходных файлов, у меня было бы распространение, которое я не мог бы отслеживать.

Я полагаю, что module и module** Для этого сделано 1009 * форм, но я еще не понял, как они все должны работать вместе.Я пробовал разные комбинации с разными уровнями успеха, но ни одна из них не была полностью удовлетворительной.Я решил спросить здесь, как это делается.

Исходный файл выглядит примерно так:

#lang debug at-exp racket

(require rackunit data/collection racket/dict racket/generic racket/pretty
         racket/hash describe "graph.rkt")  ; <--- same requires needed in every scope
(provide make-slipnet run-slipnet spread-activation ...)

;; defines for making a 'slipnet' graph ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define ...)
(define ...)
(module+ test
  ...)
(define ...)
(module+ test
  ...)
...
(define (make-slipnet ...) ...) ;The rest of the file only needs these
(define (run-slipnet ...) ...)  ;two functions from this section.

;; defines for doing spreading activation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(define ...)
(define ...)
(module+ test
  ...)
...
(define (spread-activation ...) ...) ;The rest of the file only needs this
                                     ;function from this section
;; Etc.

(module+ main
  ;generate some human-readable output here, calling make-slipnet,
  ;run-slipnet, spread-activation, functions from "graph.rkt", etc.
)

Как вы разделяете эти функции на их естественные группы?

1 Ответ

0 голосов
/ 26 сентября 2018

Использование подмодулей для семантической организации.Используйте комментарии для визуальной организации.

Подмодули полезны, когда код должен выполняться только в определенных режимах (например, test подмодули для тестирования, main подмодули для программ / команд и т. Д.).Они также полезны, когда вам нужна одна и та же вспомогательная функция как во время компиляции (в макропреобразователе), так и во время выполнения;Вы можете определить его один раз в подмодуле и требовать подмодуля на нескольких этапах.

Но в противном случае просто используйте комментарии и пробелы.В настоящее время я предпочитаю разделять основные разделы со строками из 60 знаков равенства (двойная линия) и второстепенные подразделы со строками из 40 дефисов.Иногда я помещаю заголовок раздела под чертой (если я могу придумать краткую метку).

Совет: в Emacs и DrRacket вы можете вставить 60 знаков равенства, нажав Escape 6 0 =.Аналогично для вставки n копий любого другого символа.

Пример:

;; ============================================================
;; Data definitions

;; A Vertex is a Symbol.

;; A Graph is (graph (hashof Vertex (Listof Vertex))).
(struct graph (out-edges))

;; ============================================================
;; Graph algorithms

;; ----------------------------------------
;; Paths

;; find-path : Graph Vertex Vertex -> (U #f (Listof Vertex))
(define (find-path g from to) ....)

;; ----------------------------------------
;; Strongly-connected components (SCCs)

;; vertex->scc : Graph Vertex -> (Listof Vertex)
(define (vertex->scc g vertex) ....)

;; ============================================================
;; External forms

;; read-graph : InputPort -> Graph
(define (read-graph in) ....)

;; write-graph : Graph OutputPort -> Void
(define (write-graph g out) ....)
...