2013-03-10 28 views
7

Buduję symboliczny silnik pochodnej. Na przykładJaki jest najbardziej aktualny sposób na kompilację cytatów kodu w F #

let f = <@ fun x:double -> x * x @> 
let df = der f 

i wywołana przez nią ekspresja będzie

<@ 2 * x @> 

rzeczywiste równanie może być dowolnie skomplikowany.

Tworzenie pochodnych nie są zbyt trudne przy użyciu rekurencyjnego dopasowanie wzoru i transformacje, ale w końcu chcę użyć wygenerowanych równań w ciasnych pętli liczbowych jakbym miał je ręcznie napisane. Jest to kod numeryczny computing więc szybciej jest zawsze lepiej (jeśli to możliwe)

Szukałem na notowania kompilatora FSharpX ale wygląda tłumacza zamiast kompilatora.

+6

Znam również klony, matlab, pylab i kamień za pomocą pióra i papieru. Moje pytanie dotyczyło kompilowania cytatów z kodu. – bradgonesurfing

+0

Moja sugestia była taka, że ​​możesz chcieć używać języków, które z natury wspierają symboliczną manipulację, zamiast próbować implementować ją w innych językach. –

+0

Również - wiele osób wcześniej o to pytało. Po prostu wyszukaj w Google lub StackOverflow. –

Odpowiedz

7

Nie testowałem tego, ale kod, który tłumaczy cytaty F # do wyrażeń LINQ (i kompiluje je) został przeniesiony z F # PowerPack do biblioteki F # Core, więc uważam, że jest to najbardziej aktualna wersja :

open Microsoft.FSharp.Linq.RuntimeHelpers 

LeafExpressionConverter.EvaluateQuotation <@ 1 + 2 @> 

i użyć go do lambda

let d=LeafExpressionConverter.EvaluateQuotation <@ fun y -> y+1.0 @> 
    :?> (double -> double) 

Console.WriteLine(d 10) 

wyjścia

11 

Odnotuj rzutowanie na końcu, aby przekształcić '' obj '' w lambdę odpowiedniego typu.

+0

Bardzo fajne nowe rzeczy. Brak odnośników do tego w google, z wyjątkiem bardzo krótkiego, nieokreślonego dokumentu. btw, gdybym miał EvaluateQuotation <@ fun y -> y + 1 @> na przykład otrzymuję zwracany typ obiektu. Jak przekonwertować to do właściwego użytego lambda. Chyba potrzebuję obsady. – bradgonesurfing

+0

Sądzę, że oczywistym następnym pytaniem jest, w jaki sposób wyrażenia LINQ są konwertowane na prawdziwy kod w czasie wykonywania w porównaniu do czasu kompilacji? – bradgonesurfing