Как можно оценить выражение, хранящееся в виде строки в F # - PullRequest
11 голосов
/ 16 декабря 2008

Я хочу сделать что-то вроде этого:

let x = 5
let y = 10

let expr = Console.ReadLine()

expr

Где можно набрать "x+y" в консоли для сохранения в expr.

Как можно оценить подобное утверждение в F #?

В конечном счете, я хочу, чтобы пользователь мог вводить выражения или набор правил для системы на веб-странице и сохранять их в базе данных для применения в нужное время в библиотеке F #. Я просто не знаю, как преобразовать введенную строку в значение функции в F #.

Спасибо за любую помощь, которую вы можете оказать!

Адам

Ответы [ 5 ]

4 голосов
/ 03 января 2009

Я только что видел, как Джо использует оценки цитат на своем F # для страницы разработки игр

      open Microsoft.FSharp.Linq.QuotationEvaluation
      ...
      let mk_gravity scale_func (up: 'Vec): 'Vec =
      let q = <@ let (*) = %scale_func in -9.81 * up @>
      q.Eval()

В качестве альтернативы, если вам нужна простая математическая оценка, вы можете загрузить анализатор выражений Эдмонодо и его оценщик из его кода кодекса: Символическое дифференцирование в C # / F #

Удачи - Йиржи

2 голосов
/ 16 декабря 2008

F # не имеет eval, как уже упоминалось, но если вы можете определить грамматику, вы можете использовать реализации Lex и Yacc в F # (fslex и и fsyacc).

EDIT:

В качестве быстрого наблюдения я знаю, что в ocaml вы можете использовать интерактивную консоль для своих пользователей с помощью ocamlmktop. Я не уверен в эквиваленте в F #. Это, однако, не похоже на то, что вы хотите с веб-интерфейсом (правильно?).

0 голосов
/ 02 декабря 2010

Или вы можете посмотреть мой код F # , который реализует оценщик математических выражений.

0 голосов
/ 27 февраля 2009

Для этого нет ничего необычного.

Я не уверен, каковы ваши потребности, но вы можете рассмотреть образец Dynamic LINQ. Он имеет небольшой синтаксический анализатор для генерации деревьев выражений, которые затем можно компилировать или манипулировать ScottGu говорит об этом здесь .

Хотя это выглядит, как правило, для расширения запросов LINQ, он действует как хороший анализатор. Мы взломали его для поддержки привязки do / let для большей гибкости.

0 голосов
/ 16 декабря 2008

F # не имеет функции eval, как у Lisp (AFAIK), если вам это интересно. Вы можете создать дерево выражений самостоятельно, основываясь на строковом вводе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...