Глядя на исходный код (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
У меня есть небольшой вопрос: вы видите причину, почему #load выполняет сценарий каждый раз, когда я использую #load в том же скрипте? Я только хочу выполнить его в первый раз, когда FSI увидит это. – forki23
@ forki23 - Возможно, файл изменился? - Я думаю, что это на самом деле разумное поведение - он очень похож на '# include' в C –
, но есть большой pb, но с таким подходом: он обновляет имена для загруженных классов, что происходит каждый раз, когда директива активируется, что делает два файлы с использованием тех же классов несовместимы. это очень плохо IMO – nicolas