2013-03-10 24 views
7

Sembolik bir türev motoru yapıyorum. ÖrnekKod kotasyonlarını derlemenin en güncel yolu nedir? F #

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

ve elde edilen ekspresyonu için

<@ 2 * x @> 

gerçek denklem keyfi karmaşık olabilir olacaktır.

türevlerinin üretimi çok zor özyinelemeli desen eşleştirme ve dönüşümleri kullanmıyorsanız ama elle bunları yazılı varmış gibi sonunda ben sıkı sayısal döngüler içinde oluşturulan denklemleri kullanmak istiyorum. Bu sayısal hesaplama kodu çok daha hızlıdır her zaman daha iyisi (mümkünse)

FSharpX tırnak derleyicisine baktım ama derleyici yerine yorumlayıcıya benziyor.

+6

Ayrıca, kalem ve kağıt ile akçaağaç, matlab, pylab ve hesaplamayı biliyorum. Sorum şu kod alıntılarını derlemekti. – bradgonesurfing

+0

Benim önerim, başka dillerde uygulamaya çalışmak yerine, sembolik manipülasyonu doğal olarak destekleyen dilleri kullanmak isteyebilirsiniz. –

+0

Ayrıca, daha önce birçok kişi bunu sordu. Sadece Google veya StackOverflow'ta arama yapın. –

cevap

7

Bunu test etmedim, ancak F # alıntılarını LINQ ifadelerine çeviren (ve derledikleri) kodu artık F # PowerPack'den F # Core kütüphanesine taşındı, bu yüzden en güncel sürüm olduğunu düşünüyorum :

open Microsoft.FSharp.Linq.RuntimeHelpers 

LeafExpressionConverter.EvaluateQuotation <@ 1 + 2 @> 

ve lambda için kullanmak

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

Console.WriteLine(d 10) 

çıkış

11 

Sonunda, '' obj '' harfini doğru türden bir lambdaya dönüştürmek için not alın.

+0

Çok güzel yeni şeyler. Google’da, çok kısa, tanımlayıcı olmayan dokümanlar hariç, bu konuda referans yok. btw Değerlendirmeler <@ fun y -> y + 1 @> 'i değerlendirdiysem, örneğin geri döndüm. Bunu uygun bir lambdaya nasıl dönüştürülebilir. Sanırım bir oyuncuya ihtiyacım var. – bradgonesurfing

+0

Sanırım bariz bir sonraki soru, LINQ ifadelerinin, çalışma zamanında derleme zamanına karşı gerçek koda dönüştürülmesini nasıl sağlıyor? – bradgonesurfing