2013-12-05 2 views
2

Я хочу загрузить файл из сценария .fsx в F # Interactive Session, но я не могу использовать #load, так как хочу загрузить его только в том случае, если определенное условие правда.Загрузите файл в FSI FSI - без использования #load

Есть ли функция типа FSI.LoadFile или что-то вместо директивы компилятора?

ответ

3

Глядя на исходный код (fsi.fs, линия 1710 here

 | IHash (ParsedHashDirective("load",sourceFiles,m),_) -> 
      fsiDynamicCompiler.EvalSourceFiles (istate, m, sourceFiles, lexResourceManager),Completed 

Теперь, некоторые из этих параметров, вероятно, легко подделать - в частности, sourceFiles и m я подозреваю, что другие параметры труднее подделать. .

Я подозреваю, что вы не пытаетесь решить проблему в хорошем смысле. альтернативным решением может быть, чтобы сделать что-то вроде

let conditionally_load fname cond = 
    if cond then System.IO.File.Copy(fname,"dummy.fs") 
    else System.IO.File.Create("dummy.fs") 
conditionally_load "something.fs" true 
#load "dummy.fs" 

Хотя вы, возможно, потребуется ;; перед #load, чтобы гарантировать, что функция работает до #load

+0

У меня есть небольшой вопрос: вы видите причину, почему #load выполняет сценарий каждый раз, когда я использую #load в том же скрипте? Я только хочу выполнить его в первый раз, когда FSI увидит это. – forki23

+0

@ forki23 - Возможно, файл изменился? - Я думаю, что это на самом деле разумное поведение - он очень похож на '# include' в C –

+1

, но есть большой pb, но с таким подходом: он обновляет имена для загруженных классов, что происходит каждый раз, когда директива активируется, что делает два файлы с использованием тех же классов несовместимы. это очень плохо IMO – nicolas

1

То, что вы хотите сделать, это сложно, так как вы хотите, решение о том, чтобы загрузить дополнительный код, который необходимо принимать при оценке время. Решением этого будет изменение оболочки, так что загрузка скрипта может быть запланирована на следующей итерации REPL. По сути, ваша функция FSI.LoadFile просто добавит путь к глобальной очереди в виде выражения ParsedHashDirective("load",["foo.fsx"], ...).

Затем очередь может быть добавлена ​​к списку actions в следующий раз, когда метод ExecInteractions вызывается в строке 1840. Это должно работать нормально, но, очевидно, вы не получите никакой поддержки intellisense.

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

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