This is a responce to a question posted by James Platt
to the racket-users
email list.
Start with single-file.rkt for an example, then see how the example can be split into multiple files with the entry point main.rkt.
This is a responce to a question posted by James Platt
to the racket-users
email list.
Start with single-file.rkt for an example, then see how the example can be split into multiple files with the entry point main.rkt.
#lang racket/gui | |
;; See also "single-file.rkt" for the same example | |
;; in a single file with more comments. | |
(require "table3-unit.rkt" | |
"row-edit-menu-unit.rkt" | |
qresults-list) | |
;; Invoke the units and introduce the definitions they | |
;; export into this scope: | |
(define-values/invoke-unit/infer | |
(link row-edit-menu@ | |
table3@)) | |
;; Run the demo: | |
(send table3 | |
setup-column-defs | |
(let ([column1 | |
(λ (data) (vector-ref data 0))] | |
[column2 | |
(λ (data) (vector-ref data 1))]) | |
(list (qcolumn "Column1" column1 column1) | |
(qcolumn "Column2" | |
(λ (row) | |
;; allows a cell to be blank | |
(if (number? (column2 row)) | |
(number->string (column2 row)) | |
"")) | |
column2)))) | |
(send table3 add-row (vector "R1C1" 10)) | |
(send table3 add-row (vector "R2C1" 11)) | |
(send table3 add-row (vector "R3C1" 12)) | |
(send table3 add-row (vector "R4C1" 13)) | |
(send frame3 show #t) | |
#lang racket | |
;; See "main.rkt" for an overview. | |
(provide row-edit-menu^ | |
table3^ | |
frame3^) | |
(define-signature row-edit-menu^ | |
(row-edit-menu)) | |
(define-signature table3^ | |
(table3)) | |
(define-signature frame3^ extends table3^ | |
(frame3)) |
#lang racket/gui | |
;; See also "main.rkt" for the same example | |
;; divided into multiple files. | |
(require qresults-list) | |
;; A signatures describes an interface. | |
(define-signature row-edit-menu^ | |
(row-edit-menu)) | |
(define-signature table3^ | |
(table3)) | |
(define-signature frame3^ extends table3^ | |
(frame3)) | |
;; A unit that exports a signature must | |
;; implement the definitions it specifies. | |
;; Units can also import signatures, | |
;; which allows the body of the unit to | |
;; refer to definitions from the imported signatures. | |
;; Before the unit is invoked, | |
;; it must be linked together with other units | |
;; that that export the signatures it imports, | |
;; which will suply the actual implementations. | |
;; Code in the body of the unit is run when the unit is invoked. | |
(define-unit row-edit-menu@ | |
(import table3^) | |
(export row-edit-menu^) | |
(define row-edit-menu | |
(new popup-menu%)) | |
(define info-menu-item | |
(new menu-item% | |
[label "info"] | |
[parent row-edit-menu] | |
[callback | |
(λ (menu-item event) | |
(define num-selected | |
(length (send table3 get-selected-row-indexes))) | |
(message-box "Info" | |
(~a "You have selected " num-selected " rows") | |
#f))]))) | |
(define-unit table3@ | |
(import row-edit-menu^) | |
(export frame3^) | |
(init-depend row-edit-menu^) | |
(define frame3 | |
(new frame% | |
[label "myTable 3"] | |
[width 800] | |
[height 600])) | |
(define table3 | |
(new (class qresults-list% | |
(super-new)) | |
[parent frame3] | |
[pref-tag 'preferences-tag] | |
[selection-type 'multiple] | |
[right-click-menu row-edit-menu]))) | |
;; Invoke the units and introduce the definitions they | |
;; export into this scope: | |
(define-values/invoke-unit/infer | |
(link row-edit-menu@ | |
table3@)) | |
;; Run the demo: | |
(send table3 | |
setup-column-defs | |
(let ([column1 | |
(λ (data) (vector-ref data 0))] | |
[column2 | |
(λ (data) (vector-ref data 1))]) | |
(list (qcolumn "Column1" column1 column1) | |
(qcolumn "Column2" | |
(λ (row) | |
;; allows a cell to be blank | |
(if (number? (column2 row)) | |
(number->string (column2 row)) | |
"")) | |
column2)))) | |
(send table3 add-row (vector "R1C1" 10)) | |
(send table3 add-row (vector "R2C1" 11)) | |
(send table3 add-row (vector "R3C1" 12)) | |
(send table3 add-row (vector "R4C1" 13)) | |
(send frame3 show #t) |
#lang racket/unit | |
;; See "main.rkt" for an overview. | |
;; A module in #lang racket/unit implicitly `provide`s | |
;; a single unit with an inferred name. | |
;; The module body is like the inside of a `define-unit form`. | |
;; Note that this module does NOT depend on "row-edit-menu-unit.rkt" | |
(require "signatures.rkt" | |
qresults-list | |
racket/gui) | |
(import row-edit-menu^) | |
(export frame3^) | |
(init-depend row-edit-menu^) | |
(define frame3 | |
(new frame% | |
[label "myTable 3"] | |
[width 800] | |
[height 600])) | |
(define table3 | |
(new (class qresults-list% | |
(super-new)) | |
[parent frame3] | |
[pref-tag 'preferences-tag] | |
[selection-type 'multiple] | |
[right-click-menu row-edit-menu])) |