LINUX.ORG.RU

Форма begin

 ,


1

1

Здравствуйте!

Изучаю scheme и в связи с этим вопрос. Насколько я понимаю, выражение (begin foo bar baz) в точности соответствует ((lambda() foo bar baz)). Так ли это?

И более того, в любом выражении, насколько я понимаю, форму begin можно тупо заменить отсутствием какой-либо формы,[upd] если не требуется группировки, когда нам нужно получить в качестве аргумента результат вычисления выражения — как указал namelessOne[/upd].

((lambda() zoo (begin foo bar baz) moo))
vs
((lambda() zoo foo bar baz moo))
Я четнепонел, зачем она тогда нужна ваще?



Последнее исправление: phill (всего исправлений: 1)

И более того, в любом выражении, насколько я понимаю, форму begin можно тупо заменить отсутствием какой-либо формы.

Нельзя, некоторые формы (как if) принимают только одно выражение.

theNamelessOne ★★★★★
()

в любом выражении, насколько я понимаю, форму begin можно тупо заменить отсутствием какой-либо формы

Не в любом. Но большинство форм предоставляют так называемый «неявный begin».

buddhist ★★★★★
()
Ответ на: комментарий от theNamelessOne

Не, ну это понятно, в этом случае можно просто группировать с помощью той же лямбды, делов то.

phill
() автор топика
Ответ на: комментарий от buddhist

А можно поподробней? В каких случаях будет разница, за исключением тех, когда begin можно заменить группировкой с помощью лямбды, как в примере theNamelessOne?

phill
() автор топика
Ответ на: комментарий от theNamelessOne

То есть бегин - это не более чем синтаксический мусор/сахар? Самостоятельного семантического значения эта форма не имеет? Правильно я понял?

phill
() автор топика
Ответ на: комментарий от phill

А можно поподробней?

(по аналогии с implicit progn)

«неявный begin» («implicit begin») — упорядоченное множество смежных форм внутри другой формы, определённых по контексту в этой форме так, как если бы они выполнялись внутри блока begin.

Тело в таких формах как when, define, lambda — это implicit begin, т. е.

(lambda (x y)
  foo
  bar)

на самом делё семантически эквивалентно

(lambda (x y)
  (begin
    foo
    bar))
theNamelessOne ★★★★★
()
Ответ на: комментарий от phill

в этом случае можно просто группировать с помощью той же лямбды, делов то.

а тут нет смысла в создании функции

lazyklimm ★★★★★
()
Ответ на: комментарий от phill

begin как раз имеет определённую семантику: «вычислить по порядку каждую форму, возвращая последнее вычисленное значение». То, что вычисление тела лямбды имеет то же поведение, как раз достигается тем, что тело составляет implicit begin.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Хотел отредактировать, но не успел: здесь foo, bar составляют implicit begin.

theNamelessOne ★★★★★
()
Ответ на: комментарий от phill

А можно поподробней? В каких случаях будет разница, за исключением тех, когда begin можно заменить группировкой с помощью лямбды, как в примере theNamelessOne?

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

Макросы вообще зачастую семантического значения не имеют, т.к. преобразовывают код в код. Но конкретно begin (do, progn) - специальные формы, которые реализуются на уровне компилятора.

unlog1c ★★★
()
Ответ на: комментарий от theNamelessOne

Тогда опять не понял. Вызов лямбда-выражения нам не гарантирует вычисления по порядку? Вы же сами сказали, что ляьбда содержит в себе неявный begin. Так содержит или не содержит?

phill
() автор топика
Ответ на: комментарий от phill

Вызов лямбда-выражения нам не гарантирует вычисления по порядку? Вы же сами сказали, что ляьбда содержит в себе неявный begin.

Гарантирует именно потому, что тело лябды — неявный begin.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Только хотел дать ссылку на Ситарама :)

buddhist ★★★★★
()
Ответ на: комментарий от phill

Самостоятельного семантического значения эта форма не имеет?

Да, вообще почитай 'Lambda Papers'.

Begemoth ★★★★★
()

Это все потому, что Scheme - это такой язык, который чуть более чем полностью состоит из свистелок и перделок, причем этими своими свистелками и перделками scheme, кагбэ свистит и пердит тебе в ухо: «Я самый минималистичный и простой ЯП, верь мне, сынок...»

anonymous
()

выражение (begin foo bar baz) в точности соответствует ((lambda() foo bar baz)). Так ли это?

Только внутри выражения. В toplevel:

(begin 
 (define x 1))
(define y x)
работает, а
((lambda () 
  (define x 1)))
(define y x
не работает.

monk ★★★★★
()
Ответ на: комментарий от anonymous

Я самый минималистичный и простой ЯП

Для требуемой семантики это истинно.

monk ★★★★★
()

Насколько я понимаю, выражение (begin foo bar baz) в точности соответствует ((lambda() foo bar baz)). Так ли это?

Не так. begin не создает нового окружения.

korvin_ ★★★★★
()

В чём разница между специалистом и лиспером?

Специалист: разрабатывает системы
Лиспер: обсуждает с такими же, насколько точно выражение (begin foo bar baz) соответствует ((lambda() foo bar baz))

anonymous
()

В чём разница между псевдо-специалистом и лиспером?

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

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.