Hi,

I am slowly getting the hang of linklets and I am playing with them in
my spare free time.

As far as I understand the current way to obtain linklets is to use
bootstrap-run.rkt in racket/src/expander.

I wrote a simple interactive program split into two modules:
factorial-input.rkt:
#lang racket/base

(require "factorial.rkt")

(let loop ()
  (printf "Enter a number: ")
  (define n (read))
  (cond
    [(exact-positive-integer? n)
     (printf "~a! = ~a~n" n (factorial n))]
    [else
     (printf "Invalid value~n")
     (loop)]))


factorial.rkt:
#lang racket/base

(provide factorial)

(define (factorial n)
  (if (= n 1)
      1
      (* n (factorial (- n 1)))))

Now I would like to compile the whole thing into linklets, so I try from
today's master branch HEAD:
racket/src/expander $ racket bootstrap-run.rkt --linklets -s -o
factorial-input.ll.rkt -t
/home/pmatos/Projects/redjacket/examples/factorial-input.rkt

First thing that tripped me up was that the output went to the terminal
instead of the file factorial-input.ll.rkt.

However, the biggest concern I had was that even though one of the lines
in the terminal says:
compile: /home/pmatos/Projects/redjacket/examples/factorial.rkt

followed by:
#hasheq((#f
         .
         #hasheq((0
                  .
                  (linklet
                   ((.get-syntax-literal!)
                    (.set-transformer!)
                    ((read 1/read))
                    (factorial)
                    (print-values))
                   ()
                   (void)
                   (call-with-values
                    (lambda ()
                      ((letrec-values (((loop_1)
                                        (lambda ()
                                          (begin
                                            'loop
                                            (let-values ((()
                                                          (begin
                                                            (printf
                                                             "Enter a
number: ")
                                                            (values))))
                                              (let-values (((n_2) (1/read)))
                                                (if (exact-positive-integer?
                                                     n_2)
                                                  (let-values ()
                                                    (printf
                                                     "~a! = ~a~n"
                                                     n_2
                                                     (factorial n_2)))
                                                  (let-values ()
                                                    (begin
                                                      (printf
                                                       "Invalid value~n")
                                                      (loop_1))))))))))
                         loop_1)))
                    print-values)
                   (void)))
                 (data
                  .
                  (linklet
                   ((deserialize-module-path-indexes
                     syntax-module-path-index-shift
                     syntax-shift-phase-level
                     module-use
                     deserialize))
                   (.mpi-vector)
                   (define-values (.inspector) (current-code-inspector))
                   (define-values
                    (.mpi-vector)
                    (deserialize-module-path-indexes
                     '#(#('#%read)
                        #&factorial-input
                        #("factorial.rkt" 1)
                        #(racket/base)
                        #("private/base.rkt" 3)
                        #("pre-base.rkt" 4)
                        #("modbeg.rkt" 5))
                     '#(0 2 6 1 3)))))
                 (decl
                  .
                  (linklet
                   ((deserialize-module-path-indexes
                     syntax-module-path-index-shift
                     syntax-shift-phase-level
                     module-use
                     deserialize)
                    (.mpi-vector))
                   (self-mpi requires provides phase-to-link-modules)
                   (define-values
                    (self-mpi)
                    (unsafe-vector*-ref .mpi-vector 3))
                   (define-values
                    (requires)
                    (let-values (((data)
                                  '#(#()
                                     #()
                                     #()
                                     #(#:cons #:list 3 0 #:mpi 4 #:mpi 1
()))))
                      (deserialize
                       .mpi-vector
                       #f
                       #f
                       '0
                       (unsafe-vector*-ref data 0)
                       '0
                       (unsafe-vector*-ref data 1)
                       (unsafe-vector*-ref data 2)
                       (unsafe-vector*-ref data 3))))
                   (define-values
                    (provides)
                    (let-values (((data) '#(#() #() #() #(#hasheqv()))))
                      (deserialize
                       .mpi-vector
                       #f
                       #f
                       '0
                       (unsafe-vector*-ref data 0)
                       '0
                       (unsafe-vector*-ref data 1)
                       (unsafe-vector*-ref data 2)
                       (unsafe-vector*-ref data 3))))
                   (define-values
                    (phase-to-link-modules)
                    (hasheqv
                     0
                     (list
                      (module-use (unsafe-vector*-ref .mpi-vector 0) 0)
                      (module-use (unsafe-vector*-ref .mpi-vector 1) 0)
                      (module-use (unsafe-vector*-ref .mpi-vector 2) 0))))))
                 (name . factorial-input)
                 (pre . (configure-runtime))
                 (side-effects . (0))))
        (configure-runtime
         .
         #hasheq((#f
                  .
                  #hasheq((0
                           .
                           (linklet
                            ((.get-syntax-literal!)
                             (.set-transformer!)
                             (configure))
                            ()
                            (void)
                            (configure #f)
                            (void)))
                          (data
                           .
                           (linklet
                            ((deserialize-module-path-indexes
                              syntax-module-path-index-shift
                              syntax-shift-phase-level
                              module-use
                              deserialize))
                            (.mpi-vector)
                            (define-values
                             (.inspector)
                             (current-code-inspector))
                            (define-values
                             (.mpi-vector)
                             (deserialize-module-path-indexes
                              '#(#(racket/runtime-config)
                                 #&(factorial-input configure-runtime)
                                 #('#%kernel))
                              '#(0 1 2)))))
                          (decl
                           .
                           (linklet
                            ((deserialize-module-path-indexes
                              syntax-module-path-index-shift
                              syntax-shift-phase-level
                              module-use
                              deserialize)
                             (.mpi-vector))
                            (self-mpi requires provides
phase-to-link-modules)
                            (define-values
                             (self-mpi)
                             (unsafe-vector*-ref .mpi-vector 1))
                            (define-values
                             (requires)
                             (let-values (((data)
                                           '#(#()
                                              #()
                                              #()
                                              #(#:cons
                                                #:list
                                                3
                                                0
                                                #:mpi
                                                2
                                                #:mpi
                                                0
                                                ()))))
                               (deserialize
                                .mpi-vector
                                #f
                                #f
                                '0
                                (unsafe-vector*-ref data 0)
                                '0
                                (unsafe-vector*-ref data 1)
                                (unsafe-vector*-ref data 2)
                                (unsafe-vector*-ref data 3))))
                            (define-values
                             (provides)
                             (let-values (((data)
                                           '#(#() #() #() #(#hasheqv()))))
                               (deserialize
                                .mpi-vector
                                #f
                                #f
                                '0
                                (unsafe-vector*-ref data 0)
                                '0
                                (unsafe-vector*-ref data 1)
                                (unsafe-vector*-ref data 2)
                                (unsafe-vector*-ref data 3))))
                            (define-values
                             (phase-to-link-modules)
                             (hasheqv
                              0
                              (list
                               (module-use
                                (unsafe-vector*-ref .mpi-vector 0)
                                0))))))
                          (name . (factorial-input configure-runtime))
                          (side-effects . (0)))))))


This linklet does not contain the definition of factorial. This is
probably my bad assumption but I thought I would get a linklet directory
with everything in the original application. Is there a current way to
do this?

Or the solution is to go manually through the requires in the original
source and run the linklet extraction for each of them?

-- 
Paulo Matos

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/ee200104-94d3-f361-be17-8910ee07cbdd%40linki.tools.
For more options, visit https://groups.google.com/d/optout.

Reply via email to