Как мне оценить выражение с заданными аргументами? - PullRequest
0 голосов
/ 15 апреля 2020

Я сейчас пытаюсь создать функцию со следующей подписью:

(define (point-app F x))

, которая вычисляет F (x). Моя цель - оценить функцию F с аргументом x в качестве аргумента.

Поэтому, если у меня есть:

(point-app '(+(* x x) 4) 2) <==> F (2) = (2 ^ 2) +4 ожидаемый результат будет 8.

Я попытался использовать eval, выполнив документы drracket :

(define (point-fixe f x)
  (eval `(let ([number x]),f)))

Но я не могу прикрепить переменную x к число. Насколько я знаю, это потому, что eval динамически загружает выражения? Я искал общие темы, но не нашел ничего, что могло бы мне помочь. Любая помощь будет с благодарностью.

1 Ответ

2 голосов
/ 15 апреля 2020

То, как вы express функция в лямбда-исчислении, равно λx.e , где e - какое-то выражение, вероятно, включающее x . Это переводится непосредственно в Racket как (λ (x) e), где снова e является некоторым выражением.

Таким образом, вашей функции просто нужно вызвать свой первый аргумент, функцию, во втором, некоторое значение:

(define (point-app F x)
  (F x))

Если вы хотите express свои функции в качестве литеральных данных (скажем, списков), то вы можете использовать eval, чтобы превратить их в функции:

(define (source->function function-form)
  (eval function-form))

Так что теперь :

> (point-app (source->function '(λ (x) (+ (* x x) 4))) 2)
8

Если вы не хотите использовать базовый механизм языка, вам нужно написать оценщик. Это не очень сложно, и я уверен, что есть много примеров.

...