Присвоение результата выражения переменной - PullRequest
1 голос
/ 17 декабря 2009

Работа с DrScheme (язык - довольно большой). Попытка передать результат выражения в переменную, которая впоследствии может быть использована в другом выражении. Вот упрощенная версия проблемы:

Окно определений:

(define (tot a b c) (+ a b c))

(define (tot2) (+ (tot a b c) 1))

Окно переводчика

> (tot 5 6 7)

18

> (tot2)

.   . reference to undefined identifier: a

Конечно, я хочу получить результат 19. Было бы легко, если бы DrScheme выполнял всю алгебру одновременно, но мне нужно, чтобы она решила первое выражение, а затем решила второе выражение на основе результата первый.

Ответы [ 5 ]

4 голосов
/ 17 декабря 2009

Это то, что вы ищете?

(define (tot a b c) (+ a b c))
(define (tot2 a b c) (+ (tot a b c) 1))

Тогда

(tot2 5 6 7)

должно привести к 19.


Если вы хотите, чтобы tot2 был присвоен целочисленному значению, а не функции,

(define (tot a b c) (+ a b c))
(define tot2 (+ (tot 5 6 7) 1))

присваивает результат выражения (+ (tot 5 6 7) 1) имени tot2

3 голосов
/ 17 декабря 2009

Схема имеет лексическую область: , поэтому a, b, и c будут существовать только для динамического экстента tot.

Динамический экстент вызова процедуры - это период между началом вызова и его возвратом (через gnu ).

2 голосов
/ 17 декабря 2009

Вы представляете себе «настойчивость», которой нет, хотя, вероятно, это правдоподобно, учитывая предыдущий опыт работы с математикой.

То есть: если я решаю математическую задачу, и я говорю, чтох равен 5, ну тогда х должен остаться равным пяти для оставшейся части задачи;например, пока я не сотру доску.

Итак, вы можете написать такой язык программирования?Да!На самом деле, я мог бы написать для вас небольшой макрос в DrScheme, который произвел бы именно то поведение, которое вы, похоже, искали: он настроил бы глобальную таблицу переменных так, чтобы каждая привязка переменной вызывала обновление этой единственной таблицы переменных.

НО!Все опрошенные мной программисты (один) (хорошо, это я) согласились, что это будет очень плохая идея.

Чтобы понять почему, представьте, что у меня есть большая программа, которая содержит несколько переменных, называемых «а».Затем, всякий раз, когда кто-то в части A программы вызывает функцию с переменной с именем «a», часть B программы неожиданно меняет свое поведение.Это сделает почти невозможным рассуждать о поведении более крупных программ.

В более общем смысле, это проблема "состояния" и "мутации".

По этой причине вы не можете ссылатьсяпеременным, отличным от тех, которые находятся "в области видимости".То есть те переменные, чья форма привязки (в данном случае «определить») содержит ссылку.

0 голосов
/ 20 декабря 2009

Прочитав все комментарии, я понял, что путаю две проблемы: интерпретатор должен оценивать выражение с помощью переменных и фактически предоставлять значения для этих переменных. Из-за этой путаницы вопросы, которые я задавал, не имели смысла. Вот упрощенная версия решения. Как вы можете видеть, это смущающе просто - я просто использовал «read», чтобы пользователь ввел значения.

(define a (read))
(define b (read))
(define c (read))
(define d (read))
(define ee (read))
(define f (read))
(define tot (+ a b c))
(define tot2 (+ d ee f))
(define grandtotal (+ tot tot2))
(display grandtotal)

Я использовал этот подход в реальной программе, и теперь у меня есть симпатичное небольшое приложение, которое подводит итог моим часам работы за неделю. Спасибо всем за помощь пациенту.

0 голосов
/ 18 декабря 2009

Основываясь на ваших комментариях к ответу Джона, я думаю, что вам нужно просто присвоить результат каждого вызова функции переменной (либо одной переменной для каждой, либо поместить их все в список), а затем добавить эти результаты вместе.

...