LINUX.ORG.RU

Релиз PLT Scheme 4.0

 , ,


0

0

12 июня вышла новая версия PLT Scheme 4.0. Из нового:

  • разнообразные улучшения синтаксиса,
  • серьезно обновлена документация,
  • поддержка R6RS и улучшена поддержка R5RS,
  • добавлен Typed Scheme,
  • JIT.

>>> Подробности

★★★★

Проверено: UVV ()

Ответ на: комментарий от tailgunner

> Какой x?

Ещё раз: (lambda (x) (lambda (y) (+ x y)) - функция, которая создаёт замыкание (lambda (y) (+ x y)), содержащее в себе значение x.

Пример:

(define f (lambda (x) (lambda (y) (+ x y))))

(define inc (f 1)) ; здесь значение x сохраняется неявным образом

(inc 2) -> 3 ; здесь оно использовалось.

Так понятнее? Или и дальше будешь с умным видом чушь нести?

Итак, жду того же самого на Си. Как это сделать и словить segfault я знаю. Покажи, как без сегфолта и с обязательно неявным захватом x.

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

ЗЫ: чтоб тебе, как сишнику, понятнее было: в случае, когда функция возвращает просто лямбду, не ссылающуюся на свободные переменные, то это то же, о чём ты говорил - просто указатель на функцию. Это можно в любом языке с вложенными функциями использовать. Однако, если возвращаемая лямбда ссылается на переменные, существующие во внешнем окружении (как в нашем случае x), то это будет представленно в виде пары: environment, содержащий значение x, и указатель на функцию, получающую в качестве аргументов сам environment и её аргумент y.

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

В общем, учись. И не говори глупости с таким апломбом. Или хотя бы стыдись после того, как такое сделаешь, и извиняйся перед публикой за то, что обманул ненамеренно.

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

tailgunner,

Без стеба, подначек и прочего, чтобы не кормить троллей,

что бы ты назвал замыканием, и почему ты считаешь, что в приведенном анонимусом примере не используется замыкание (closure)?

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

> что в приведенном анонимусом примере не используется замыкание (closure)?

Я считаю, что в приведенном анонимусом примере используется closure. Но _я_ говорил (и даже ссылку проставил) о коде, который привел Legioner, и именно за эти слова получил титулы :) Если мне кто-нибудь объяснит, что там принципиально нельзя сделать на вложенных функциях Си - я буду признателен. Еще раз ссылка на код: http://www.linux.org.ru/jump-message.jsp?msgid=2831880&cid=2835704

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

> чтоб тебе, как сишнику, понятнее было: в случае, когда функция возвращает просто лямбду, не ссылающуюся на свободные переменные, то это то же, о чём ты говорил - просто указатель на функцию. Это можно в любом языке с вложенными функциями использовать. Однако, если возвращаемая лямбда ссылается на переменные, существующие во внешнем окружении (как в нашем случае x), то это будет представленно в виде пары: environment, содержащий значение x, и указатель на функцию, получающую в качестве аргументов сам environment и её аргумент y.

За объяснение - спасибо. Я не только сишник/плюсатый, но и питонист, так что то, что ты описал, я знаю и использую. Кстати, Схему почти в объеме SICP я тоже знаю.

> В общем, учись.

Симметрично. Только ты учи не CS, а просто учись читать внимательно.

> извиняйся перед публикой за то, что обманул ненамеренно.

Ты сам обманулся. И, по ходу, обманул и других.

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

> Я считаю, что в приведенном анонимусом примере используется closure.

Ты утверждал, что "в Схеме замыканий нет".

И ты не привёл кода на Си.

> что там принципиально нельзя сделать на вложенных функциях Си

Си - Тьюринг-полный язык. Принципиально на нём сделать можно всё.

Принципиально же нельзя заставить его создавать окружение замыкания неявным образом. То есть можно, коненчо же, но для этого потребуется препроцессор размером с половину компилятора Си.

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

Дурак ты, и не лечишься. Не способен ты признавать своих ошибок, а это самое гнилое качество, какое только может быть у человека.

Итак, замыкания в Схеме есть. Ничего подобного замыканиям в языках только с вложенными функциями нет. Всё. Остальное - за пределами этого обсуждения. Ты сказал глупость, и не имеешь сил этого признать.

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

>> Я считаю, что в приведенном анонимусом примере используется closure.

> Ты утверждал, что "в Схеме замыканий нет".

пруфлинк?

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

Анонимуса, видимо, раззадорило предложение, которое он понял неверно:

>Кстати... может, я уже забыл Схему напрочь, но где там замыкания? Обычные вложенные функции.

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

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

> Если меня не глючит, то в том коде, на который ты ссылаешься, замыкания все же есть (например, функция main)

По-моему, из dfa-interpreter возвращается значение, выработанное main, а не сама main. Или я что-то путаю с квотингом?

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

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

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

> По-моему, из dfa-interpreter возвращается значение, выработанное main, а не сама main.

Всё правильно. Точнее сказать, значение возвращает finish-work.

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

main ссылается на аргументы внешней функции.

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

>>((if (> a 10) + -) a b) Можно реализацию на C++ к примеру?
>a + (a > 10 ? b : -b)
>aydef

Молодец aydef - сразу узрел что спрашивающий просит частный случай :)
Давай аналог общего:
((if (> a 10) fn1 fn2) a b)

anonymous
()

Типизованный Scheme??? Они че, с дубу рухнули?!

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