2015-05-06 4 views
2

Я использую Chicken Scheme 4.9.0.1 на облачном рабочем месте Cloud9, построенном из исходного кода.Несвязанная переменная ошибка при загрузке процедуры из внешнего файла

Я пытался его с этим (я в основном коде с питоном, поэтому я извиняюсь за странный синтаксис Паренс):

(define load-module 
    (lambda (filepath) 
     (begin 
      (load filepath) 
     ) 
    ) 
) 

(define print 
    (lambda (command) 
     (begin 
      (display command) 
      (newline) 
     ) 
    ) 
) 

(load-module "../src/Basics.scm") 
(print (exponent 5 2)) 

где показатель был:

(define (exponent num pow) 
    (if (equal? pow 1) 
     num 
     (* num (exponent num (- pow 1)) 
     ) 
    ) 
) 

Но это дает мне следующая ошибка:

Started /home/ubuntu/workspace/test.scm 

CHICKEN 
(c) 2008-2014, The Chicken Team 
(c) 2000-2007, Felix L. Winkelmann 
Version 4.9.0.1 (stability/4.9.0) (rev 8b3189b) 
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ] 
bootstrapped 2014-06-07 

; loading /home/ubuntu/workspace/project1/src/test.scm ... 
; loading ../src/Basics.scm ... 

Error: unbound variable: pow 

     Call history: 

     <eval> [append] (cons item (reverse target)) 
     <eval> [append] (reverse target) 
     <eval> [append] (reverse (cons item (reverse target))) 
     <eval> [append] (cons item (reverse target)) 
     <eval> [append] (reverse target) 
     <eval> [append] (reverse (cons item (reverse target))) 
     <eval> [append] (cons item (reverse target)) 
     <eval> [append] (reverse target) 
     <eval> [append] (reverse (cons item (reverse target))) 
     <eval> [append] (cons item (reverse target)) 
     <eval> [append] (reverse target) 
     <syntax>   (print (exponent 5 2)) 
     <syntax>   (exponent 5 2) 
     <eval> (print (exponent 5 2)) 
     <eval> (exponent 5 2) 
     <eval> [exponent] (equal? pow 1)  <-- 

Я пробовал ту же процедуру для другой реализации схемы (biwascheme, u петь их онлайн REPL), и это сработало. Когда я добавил код непосредственно в файл, над которым работал, не загружая его из отдельного файла, он работает.

Почему он дает эту несвязанную переменную ошибку только при загрузке из отдельного файла?

+1

Это прекрасно работает для меня. Я попробовал его с 'csi', а затем попытался скомпилировать его с' csc'. Я даже воспроизвел структуру каталогов, которую подразумевал ваш оператор 'load', чтобы узнать, связано ли это с этим. –

+0

Действительно? Уч. Означает ли это, что что-то не так с тем, как я собрал CHICKEN? – theblacksquid

+0

Я понятия не имею. Я использовал сборку CHICKEN из репозитория Debian. –

ответ

0

Работает отлично для меня. Compiled Chicken с той же версией на Ubuntu, вплоть до конкретной версии.

История вызовов выглядит очень странно. Более конкретно:

<eval> [append] (reverse target) 
    <syntax>   (print (exponent 5 2)) 

[append] (reverse target) участок выглядит странно. Функция экспонента (как описано) не вызывает этого. Даже если предположить, что история была неправильной, и это было фактически внутри функции print, я проверил library.scm и эта история также не имеет смысла.

Это приводит меня к мысли, что загруженный файл Basics.scm по какой-то причине не тот, который вы ожидаете, и вы закончили с другой, нерабочей версией exponent.

Вы можете попросить Chicken отобразить содержимое файла, чтобы убедиться. Что-то вроде:

(with-input-from-file "../src/Basics.scm" 
    (lambda() 
    (display (read)))) 

Результат должен соответствовать ожидаемому контенту.

+0

Вау, большое спасибо за этот сценарий, Стивен, выясняется, что по какой-то причине команда '(load-module)' загружала совершенно другую команду, которая также находилась в 'Basics.scm', и мешала с командой, которая должна была выполнить. Замечание о нарушении команды исправило проблему. – theblacksquid

+0

Вопрос только в том, почему * несвязанная команда впуталась в стек вызовов таким образом ... – theblacksquid

 Смежные вопросы

  • Нет связанных вопросов^_^