Автор | Сообщение |
Alex![]()
54 сообщений |
#715 2009-11-11 22:15 GMT+3 часа(ов) |
Как написать сабж?
Моих знаний хватает только на вот это:
Есть ли способ лучше? Чтобы, например, можно было написать: (3 + 4) P.S. syntax-case не предлогайте, его нету в r5rs. |
|
misha![]()
1275 сообщений |
#866 2009-12-24 15:28 GMT+3 часа(ов) |
Вопрос еще открыт?
|
|
Alex![]()
54 сообщений |
#867 2009-12-24 15:34 GMT+3 часа(ов) |
Да, открыт.
|
|
misha![]()
1275 сообщений |
#870 2009-12-24 17:58 GMT+3 часа(ов) |
(define TraceRules? #f)Протестируйте! Возможны ошибки. |
|
Alex![]()
54 сообщений |
#872 2009-12-24 18:19 GMT+3 часа(ов) |
Что ты сделал? Обобщил мой пример? Я не это хотел:
Цитата |
|
misha![]()
1275 сообщений |
#873 2009-12-24 18:35 GMT+3 часа(ов) |
Где писать и как писать? Пример можно, а то не врубаюсь, что ты хочешь.
Если нужен калькулятор на схеме, то их в нете полно ![]() |
|
misha![]()
1275 сообщений |
#874 2009-12-24 18:52 GMT+3 часа(ов) |
misha![]()
1275 сообщений |
#878 2009-12-24 19:54 GMT+3 часа(ов) |
Если нужно так
>(calc: '(4 + 4 * (2 * 3))) то это также просто. |
|
Alex![]()
54 сообщений |
#882 2009-12-24 21:04 GMT+3 часа(ов) |
Хорошо, я действительно плохо объяснил чего хочу, тогда спрошу по другому: можно ли в схеме создать макрос используя syntax-rules, который бы менял место оператора, чтобы, например, (2 op 3) заменялось перед вычислением на (op 2 3)? Можно это сделать, не нарушая r5rs, или нет? И почему?
|
|
misha![]()
1275 сообщений |
#884 2009-12-24 22:43 GMT+3 часа(ов) |
Любое использование макросов нарушает чистоту r5rs (конечно, спорное утверждение
![]() 2 новичков: Понятно, что описывать проблему лучше проблемно-ориентированным языком. Макросы помогают создавать новый проблемно-ориентированный диалект схемы, на котором проще и понятнее описать решение. Т.е. идеал - схема-r5rs + наши библиотеки (процедуры и макросы) + код (для решения конкретной задачи), а не схема-r5rs + чужие библиотеки (зависящие то реализации схемы) + код. 2 Alex: Если проработать приведенный мною код, то будет понятно, что макросы и так перед вычислением заменяют (2 op 3) на (op 2 3), они для этого созданы. Например, (define x (lambda (x) (i: 8 * 2 + x))) преобразуется макросом в (define x (lambda (x) (+ 16 x))) т.е. мой макрос оптимизирует код в тех реализациях схемы, которые этого не умеют делать, и в таком оптимизированном виде функция преобразуется в байт-код (или в список объектов). |
|
misha![]()
1275 сообщений |
#885 2009-12-24 22:54 GMT+3 часа(ов) |
ЦитатаЕсли интересно, то можно реализовать calc:. И показать мне код ![]() |
|
Alex![]()
54 сообщений |
#888 2009-12-25 02:51 GMT+3 часа(ов) |
> Любое использование макросов нарушает чистоту r5rs
Что? > Понятно, что описывать проблему лучше проблемно-ориентированным > языком. Макросы помогают создавать новый проблемно-ориентированный > диалект схемы, на котором проще и понятнее описать решение. Я считаю, что макросы, написанные с помощью syntax-rules - это ленивые функции. Они дают возможность отложить вычисление аргументов. Хотя, тоже самое можно сделать при помощи quote: (define (if. qt qthen qy qelse qn)Т.е. такие макросы, которые по r5rs писаны, по сути, нафиг не нужны кроме как лишний раз не писать '. отредактировал(а) Alex: 2009-12-25 03:16 GMT+3 часа(ов) |
|
misha![]()
1275 сообщений |
#891 2009-12-25 04:27 GMT+3 часа(ов) |
ЦитатаА как ты назовешь замену стандартных макросов сделанных по r5rs на собственные. Вспомни мой set! ![]() ЦитатаТы где это прочитал? ![]() Пиши если не понятно. |
|
Alex![]()
54 сообщений |
#894 2009-12-25 06:50 GMT+3 часа(ов) |
> А как ты назовешь замену стандартных макросов
> сделанных по r5rs на собственные. Вспомни мой set! Хорошо, в этом случае да. Но почему любое: "Любое использование макросов нарушает чистоту r5rs"? > Ты где это прочитал? Что тебя конкретно не устраивает? С чем ты не согласен? Вот еще пример: (define (my-set! qvar qval) P.S. (2 + 5) ;==> 7 можно иль нет? И почему? |
|
misha![]()
1275 сообщений |
#895 2009-12-25 15:10 GMT+3 часа(ов) |
Цитата Ленивые вычисления - это непросто отложенные вычисления, а отложенные до первого вызова. Т.е. вычисления происходят только когда это необходимо. Например, (define (fibonacci n) По сути, delay - это та же lambda, которая сохраняет результат вычисления после первого вызова, а затем далее его просто подставляет. |
|
misha![]()
1275 сообщений |
#896 2009-12-25 15:32 GMT+3 часа(ов) |
ЦитатаУ меня же должны быть собственные предубеждения ![]() ЦитатаЧтобы так писать необходимо реализовать новый синтаксический анализатор, и далее через собственный repl работать. Короче, необходимы серьезные знания схемы и синтаксического анализа. Серьезно, советую реализовать макрос calc:, тем более, что я уже почти все сделал (даже приоритет операторов указал ![]() |
|
misha![]()
1275 сообщений |
#899 2009-12-25 19:46 GMT+3 часа(ов) |
Я все таки заставил схему глотать подобного рода выражения:
> (look-like if (-9) ((a = (b = 4)) (9 + 9)) else (a = -1)) |
|
Alex![]()
54 сообщений |
#906 2009-12-26 01:33 GMT+3 часа(ов) |
> Ленивые вычисления - это непросто отложенные вычисления,
> а отложенные до первого вызова. Я не говорил про ленивые вычисления, я сказал, что считаю, что макросы, написанные по r5rs - это ленивые функции. И дальше я объяснил, что именно я под этим понимаю: возможность отложить вычисление аргументов, т.е. не писать лишний раз quote. > Чтобы так писать необходимо реализовать новый синтаксический > анализатор, и далее через собственный repl работать. Почему нельзя без всего этого? |
|
misha![]()
1275 сообщений |
#907 2009-12-26 02:10 GMT+3 часа(ов) |
ЦитатаДавай лучше разберемся. Если макросы называть ленивыми, то и функции придется называть ленивыми, а схема, как потомок лиспа, изначально не является ленивым языком. Т.е. абсурд получается. Макрос - это прежде всего функция аргументы которой предварительно не вычисляются. Макрос их сам обрабатывает. ЦитатаПо сути, ты предложил написать новый диалект. Тебе необходимо переписать функцию eval - сердце схемы. |
|
Alex![]()
54 сообщений |
#909 2009-12-26 02:55 GMT+3 часа(ов) |
> Если макросы называть ленивыми, то и функции придется называть
> ленивыми Почему? > Макрос - это прежде всего функция аргументы которой предварительно > не вычисляются Именно это я и имел ввиду под фразой "отложить вычисление аргументов". > По сути, ты предложил написать новый диалект. Я всеголишь спросил можно или нет, и почему? |
|
misha![]()
1275 сообщений |
#910 2009-12-26 03:30 GMT+3 часа(ов) |
ЦитатаТак надо было говорить с самого начала ![]() ЦитатаЯ же сказал: макрос - это прежде всего функция... Это и имелось ввиду ![]() ЦитатаСудя по моим высказываниям - ![]() |
|
Alex![]()
54 сообщений |
#911 2009-12-26 06:11 GMT+3 часа(ов) |
> Так надо было говорить с самого начала
В чем разница? >>макросы, написанные по r5rs - это ленивые функции. > Если макросы называть ленивыми, то и функции придется называть > ленивыми > Я же сказал: макрос - это прежде всего функция... Я ничего не понял. > Судя по моим высказываниям - yes Но это не так просто. По каким твоим высказываниям следует, что можно ввести в repl (не "свой", а "схемовский") выражение (2 + 5) и то, что оно вычислится в 7? |
|
misha![]()
1275 сообщений |
#912 2009-12-26 14:02 GMT+3 часа(ов) |
ЦитатаУ меня такое ощущение, что ты задаешь вопросы уже имея свои собственные ответы. Твой код будет всего лишь надстройкой поверх схемы, вычислять то придется ей, а из собственного repl, если необходимо, можно реализовать выход. Лень писать? так и скажи ![]() ЦитатаТы применил термин ленивые функции к не ленивым макросам, поэтому по аналогии - функции так же ленивы. отредактировал(а) misha: 2009-12-26 14:10 GMT+3 часа(ов) |
|
misha![]()
1275 сообщений |
#913 2009-12-26 14:15 GMT+3 часа(ов) |
Может тебе необходимо использовать подобные синтаксические конструкции только внутри lambda и define? Так это же еще проще. Реализуй свои версии define и lambda.
|
|
misha![]()
1275 сообщений |
#916 2009-12-26 17:41 GMT+3 часа(ов) |
Чуток исправил i: и вот результат:
> (format-infix: 6 + (4 * 5 + 8) * 7 + 23) |
|
Alex![]()
54 сообщений |
#918 2009-12-26 18:09 GMT+3 часа(ов) |
>>> Судя по моим высказываниям - yes Но это не так просто.
>> По каким твоим высказываниям следует, что можно ввести в repl >> (не "свой", а "схемовский") выражение (2 + 5) и то, что оно >> вычислится в 7? > Твой код будет всего лишь надстройкой поверх схемы, > вычислять то придется ей, а из собственного repl, > если необходимо, можно реализовать выход. > Лень писать? так и скажи Значит не следует. Значит нельзя? > Ты применил термин ленивые функции Правильно, и дальше объяснил, что именно я под этим понимаю. > Может тебе необходимо использовать подобные синтаксические > конструкции только внутри lambda и define? Нет. Я уже наверное раза три сказал, что мне нужно. |
|
misha![]()
1275 сообщений |
#923 2009-12-27 01:00 GMT+3 часа(ов) |
Если честно, то что ты предложил (2 + 5) - издевательство над схемой.
Так как ты хочешь реализовать нельзя. А вот мне интересно сможешь ли ты реализовать format-infix:? А то как-то странно получается, я с тобой общаюсь как с опытным схимером, а ты только задаешь вопросы. Давай впредь обсуждать код. Я жду от тебя код format-infix: > (format-infix: 6 + (4 * 5 + 8) * 7 + 23) |
|
Alex![]()
54 сообщений |
#933 2009-12-27 23:09 GMT+3 часа(ов) |
> Так как ты хочешь реализовать нельзя.
Почему? > А вот мне интересно сможешь ли ты реализовать format-infix:? Опиши подробнее как оно должно работать. Например, учитывать ли приоритет операторов, если да, то приведи список всех операторов в порядке возрастания приоритета. Или ты имеешь ввиду только арифметические операторы? А то получается реализуй то не знаю что. |
|
misha![]()
1275 сообщений |
#940 2009-12-28 00:44 GMT+3 часа(ов) |
ЦитатаТак как ты хочешь у меня выходит только через repl. ЦитатаЕсли ты сможешь реализовать + - * /, то остальные добавить не составит и труда. Тем более что я уже это реализовал выше ![]() Если справишься реализуй еще и format-define: >(format-define: (abc x y) |
|
misha![]()
1275 сообщений |
#942 2009-12-28 01:01 GMT+3 часа(ов) |
И чуть не забыл
![]() Пойми, ты спрашиваешь почему нельзя реализовать, а никаких усилий с твоей стороны я не вижу. Т.е. типа мне это нужно ![]() Я считаю, что если ты сам не попробуешь реализовать, то все мои попытки объяснить тщетны. |
|