Hello,

I'm trying to understand the call instruction in RTL, and having some
trouble. I'm trying to write the simplest function I can that calls
another function. I decided to do the equivalent of (lambda (x) (x)),
so I don't have to worry about top-level variable references. So I
tried the following in the latest git wip-rtl:

(define (const) 3)
(define call-arg (assemble-program '((begin-program call-arg)
(assert-nargs-ee/local 1 1) (call 1 1 1 ()) (return 1))))
(call-arg const)

If I understand correctly, call-arg is called with the procedure const
in register 0. Then it calls const, asking const to put its result in
register 1, and finally returns const's result, which is 3. Instead, I
got this error:

ERROR: In procedure (#<procedure const ()> . #0#):
ERROR: Wrong type to apply: (#<procedure const ()> . #0#)

I didn't understand this error, but after puzzling over the code for a
while, I realized that I was calling const from register 1 instead of
register 0. So I don't understand why const was even in the error, but
I fixed the typo and tried again like this:

 (define call-arg (assemble-program '((begin-program call-arg)
(assert-nargs-ee/locals 1 1) (call 1 1 0 ()) (return 1))))
(call-arg const)

That gave a segmentation fault.

So I have three questions: What did my first attempt really do? Why
did my second attempt fail? And how do I really use the call
instruction?

Thanks,
Noah

Reply via email to