[racket] modules: require and provide behaviour

From: Matthias Felleisen (matthias at ccs.neu.edu)
Date: Fri Apr 20 17:13:39 EDT 2012

This works fine for me: 

#lang racket/load 

(module a racket/gui
  (provide get-devanagari-page)
  
  (define (get-devanagari-page)
    (define main-ocr-frame (new frame%
                                [label  "DEVANAGARI OCR"]	
                                [width  10000]	
                                [height 10000]))
    
    
    ;Main title
    (define title (new message%
                       [parent main-ocr-frame]
                       [label "DEVANAGARI OCR PROJECT"]
                       [font (make-object font% 20 'modern  'normal 'bold)]))
    
    ; Display main window
    (send main-ocr-frame show #t)
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    ;Display message-box allowing user to continue or exit program
    (when (equal? 'no (message-box
                       "CONVERT PAGE TO DEVANAGARI"	
                       "Do you want to continue?                 " 	
                       main-ocr-frame  ;parent	
                       '(yes-no)))     ;style
      (exit))
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    
    ;If continuing then display a get file dialog to get devanagari-page
    ; which is a page of devanagari text to OCR.
    
    (get-file
     "Get Devanagari input file" 
     main-ocr-frame              
     "C:\\Users\\Harry\\OCR_PROJECT\\DEVANAGARI_PAGE_IMAGES"
     "devanagari_page_3.gif" 
     #f  
     null
     '(("Any" "*.*") ("Common graphics jpg and gif" "*.jpg;*.gif")
                     ("JPEG *.jpg" "*.jpg") ("GIF *.gif" "*.gif")))))

(module b racket/gui
  (require 'a)
  (get-devanagari-page))

(require 'b)



Can you modify this somewhat simplified code to exhibit the problem with applying (get-devanagari-page)? 


On Apr 20, 2012, at 5:01 PM, Harry Spier wrote:

> Dear list members,
> 
> Perhaps someone could explain this "module,require and provide" behaviour.
> 
> I've created a Racket module that provides a procedure that creates a
> simple GUI dialog to return a file path and another module that uses
> the procedure.
> 
> The module to create the GUI is:
> 
> 
> #lang racket/gui
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;;
> ;; This module displays a gui file dialog
> ;; to return a page of devanagari text for
> ;; testing.
> ;;
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> 
> (provide get-devanagari-page)
> 
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;Define and display top level window
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> (define (get-devanagari-page)
>  (define main-ocr-frame (new frame%
>                              [label  "DEVANAGARI OCR"]	
>                              [width  10000]	
>                              [height 10000]))
> 
> 
>  ;Main title
>  (define title (new message%
>                     [parent main-ocr-frame]
>                     [label "DEVANAGARI OCR PROJECT"]
>                     [font (make-object font% 20 'modern  'normal 'bold)]))
> 
>  ; Display main window
>  (send main-ocr-frame show #t)
> 
>  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> 
>  ;Display message-box allowing user to continue or exit program
>  (when (equal? 'no (message-box
>                     "CONVERT PAGE TO DEVANAGARI"	
>                     "Do you want to continue?                 " 	
>                     main-ocr-frame  ;parent	
>                     '(yes-no)))     ;style
>    (exit))
> 
>  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> 
> 
>  ;If continuing then display a get file dialog to get devanagari-page
>  ; which is a page of devanagari text to OCR.
> 
>  (get-file
>   "Get Devanagari input file" ;title
>   main-ocr-frame              ;parent
>   "C:\\Users\\Harry\\OCR_PROJECT\\DEVANAGARI_PAGE_IMAGES" ;start directory
>   "devanagari_page_3.gif" ;default filename
>   #f ;default extension
>   null ;style - on Windows null means use native window style,
>   ;                       '(common) means use platform independent style
>   '(("Any" "*.*") ("Common graphics jpg and gif" "*.jpg;*.gif")
> ("JPEG *.jpg" "*.jpg") ("GIF *.gif" "*.gif"))
>   ))
> -------------------------------------------
> ------------------------------------------
> When I type
>> (get-devanagari-page)
> in the interactions window everything works fine and the window and
> dialogs display and behave correctly.
> 
> BUT in following module which requires the above module, for it to
> work I need to code "get-devanagari-page" NOT (get-devanagari-page)
> 
> I.e this works and returns a file path.:
> 
> Module get-devanagari-page.rkt
> -----------------
> #lang racket/gui
> (require "imagemagick_interface.rkt")
> (require "get-devanagari-page.rkt")
> get-devanagari-page
> ----------------------------
> 
> BUT the following displays the gui and executes  but gives an
> error:procedure application: expected procedure, given:
> #<path:C:\Users\Harry\OCR_PROJECT\DEVANAGARI_PAGE_IMAGES\devanagari_page_3.gif>
> (no arguments)
> 
> Module main.rkt
> -------------------
> #lang racket/gui
> (require "imagemagick_interface.rkt")
> (require "get-devanagari-page.rkt")
> 
> (get-devanagari-page)
> 
> ---------------------------
> It appears to me that coding "get-devanagari-page"  in module
> "main.rkt" causes procedure "get-devanagari-page" to be applied.  Can
> someone explain to me why in that case  it is applied and  it doesn't
> just return #<procedure:get-devanagari-page> without being applied as
> it does when typed in the interactions pane.
> 
> Thanks,
> Harry Spier
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users



Posted on the users mailing list.