Если я запускаю первый пример из MSDN (https://msdn.microsoft.com/en-us/library/dd233212.aspx) в окне F # Interactive, я получаю ожидаемый результат:Когда привязки в кодовых цитатах заменяются их значениями?
fun (x:System.Int32) -> x + 1
a + 1
let f = fun (x:System.Int32) -> x + 10 in f 10
Но если я запускаю его в главном из моей программы, все пусть привязки заменяются их постоянные значения:
[<EntryPoint>]
let main argv =
let a = 2
// exprLambda has type "(int -> int)".
let exprLambda = <@ fun x -> x + 1 @>
// exprCall has type unit.
let exprCall = <@ a + 1 @>
println exprLambda
println exprCall
println <@@ let f x = x + 10 in f 10 @@>
Результат:
fun (x:System.Int32) -> x + 1
2 + 1
let f = fun (x:System.Int32) -> x + 10 in f 10
Является ли это нормальным или ошибка? Являются ли правила для этого документированы? Что я могу сделать, чтобы заставить его к ожидаемому результату?
Edit:
Этот ответ (https://stackoverflow.com/a/4945137/1872399) утверждает (Variables are automatically replaced with values if the variable is defined outside of the quotation).
, но я не мог найти ни одного упоминания об этом в другом месте.
Edit 2: То, что я действительно хочу сделать
Этот код (https://gist.github.com/0x53A/8848b04c2250364a3c22) переходит в броской всех случаях и не с not implemented:parseQuotation:Value (Variable "ax1")
(я ожидал, что идти в | Var(var) ->
), поэтому не только постоянных известных в compile- время, но и функциональные параметры расширяются до их значений.
Edit 3:
Я побежал рабочую версию (https://gist.github.com/0x53A/53f45949db812bde5d97) под отладчиком, и, похоже, что один на самом деле ошибка: Котировка является {Call (None, op_Addition, [PropertyGet (None, a, []), Value (1)])}
с a
= Program.a
, так что это, кажется, побочный эффект того, что привязки в модулях компилируются в свойства. Если я прав, возможно, я должен зарегистрировать doc-ошибку в Microsoft ...
Как выглядит ваша реализация 'println'? В этом примере печатается имя переменных, обозначенное символом '| Var (var) -> printf "% s" var.Name'. Вместо этого вы заменяете значение. –
@JeffMercado Это та же реализация. Я только перевел вызов println в main. Заполните: https://gist.github.com/0x53A/393517e955736ea7f4c5 –
Хорошо, я вижу то же самое. Похоже, что включение функции в функцию имеет значение. Если тот же самый фрагмент находится на верхнем уровне, переменная остается нетронутой. –