Следующая страница > 1 < [2] [3] [4] [5] [6]

Автор Сообщение

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#715   2009-11-11 22:15 GMT+3 часа(ов)      
Как написать сабж?
Моих знаний хватает только на вот это:
 
(define-syntax i:
(syntax-rules ()
((_ a op b)
(op a b))))
 
;;test
(i: 3 + 4)
 

Есть ли способ лучше? Чтобы, например, можно было написать:
(3 + 4)


P.S. syntax-case не предлогайте, его нету в r5rs.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#866   2009-12-24 15:28 GMT+3 часа(ов)      
Вопрос еще открыт?

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#867   2009-12-24 15:34 GMT+3 часа(ов)      
Да, открыт.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#870   2009-12-24 17:58 GMT+3 часа(ов)      
(define TraceRules? #f)
 
(define (TraceRules nrule val)
(if TraceRules?
(begin (display "StepRule") (write nrule) (display ": ")
(write val) (newline)))
val)
 
(define-syntax i:
(syntax-rules ({)
((_ e)
(TraceRules 0 e))
((_ e1 op e2)
(TraceRules 1 (op e1 e2)))
((_ e1 op1 e2 op2 e3 tail ...)
(if (list? (member 'op2 '(+ -)))
(TraceRules 2
((lambda (x) (i: x op2 e3 tail ...))
(op1 e1 e2)))
(if (list? (member 'op2 '(* /)))
(TraceRules 3
((lambda (x) (i: e1 op1 x tail ...))
(op2 e2 e3)))
(begin (display "Error syntax: ")
(write '(e1 op1 e2 op2 e3 tail ...))))))))
 
Протестируйте! Возможны ошибки.

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#872   2009-12-24 18:19 GMT+3 часа(ов)      
Что ты сделал? Обобщил мой пример? Я не это хотел:
Цитата
Есть ли способ лучше? Чтобы, например, можно было написать:
(3 + 4)


P.S. syntax-case не предлогайте, его нету в r5rs.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#873   2009-12-24 18:35 GMT+3 часа(ов)      
Где писать и как писать? Пример можно, а то не врубаюсь, что ты хочешь.
Если нужен калькулятор на схеме, то их в нете полно

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#874   2009-12-24 18:52 GMT+3 часа(ов)      

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#878   2009-12-24 19:54 GMT+3 часа(ов)      
Если нужно так
>(calc: '(4 + 4 * (2 * 3)))
то это также просто.

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#882   2009-12-24 21:04 GMT+3 часа(ов)      
Хорошо, я действительно плохо объяснил чего хочу, тогда спрошу по другому: можно ли в схеме создать макрос используя syntax-rules, который бы менял место оператора, чтобы, например, (2 op 3) заменялось перед вычислением на (op 2 3)? Можно это сделать, не нарушая r5rs, или нет? И почему?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#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

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#885   2009-12-24 22:54 GMT+3 часа(ов)      
Цитата
(calc: '(4 + 4 * (2 * 3)))

Если интересно, то можно реализовать calc:. И показать мне код. ИМХО, обсуждение достоинств и недостатков чужого кода довольно полезный процесс.

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#888   2009-12-25 02:51 GMT+3 часа(ов)      
> Любое использование макросов нарушает чистоту r5rs
Что?

> Понятно, что описывать проблему лучше проблемно-ориентированным
> языком. Макросы помогают создавать новый проблемно-ориентированный
> диалект схемы, на котором проще и понятнее описать решение.
Я считаю, что макросы, написанные с помощью syntax-rules - это ленивые функции. Они дают возможность отложить вычисление аргументов. Хотя, тоже самое можно сделать при помощи quote:
(define (if. qt qthen qy qelse qn)
(if (eval qt) (eval qy) (eval qn)))
;test
(if. '(> 1 2) 'then ''yes 'else ''no)
Т.е. такие макросы, которые по r5rs писаны, по сути, нафиг не нужны кроме как лишний раз не писать '.

отредактировал(а) Alex: 2009-12-25 03:16 GMT+3 часа(ов)

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#891   2009-12-25 04:27 GMT+3 часа(ов)      
Цитата
Alex :
> Любое использование макросов нарушает чистоту r5rs
Что?

А как ты назовешь замену стандартных макросов сделанных по r5rs на собственные. Вспомни мой set!
Цитата
Alex :
Я считаю, что макросы, написанные с помощью syntax-rules - это ленивые функции. Они дают возможность отложить вычисление аргументов. Хотя, тоже самое можно сделать при помощи quote:

(define (if. qt qthen qy qelse qn)

(if (eval qt) (eval qy) (eval qn)))

;test

(if. '(> 1 2) 'then ''yes 'else ''no)

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

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#894   2009-12-25 06:50 GMT+3 часа(ов)      
> А как ты назовешь замену стандартных макросов
> сделанных по r5rs на собственные. Вспомни мой set!
Хорошо, в этом случае да. Но почему любое: "Любое использование макросов нарушает чистоту r5rs"?

> Ты где это прочитал?
Что тебя конкретно не устраивает? С чем ты не согласен?
Вот еще пример:
(define (my-set! qvar qval)
(eval `(define ,qvar ,qval)))
;test
(my-set! 'x 5)
x ;==> 5
(my-set! 'y '(+ x 2))
y ;==> 7


P.S. (2 + 5) ;==> 7
можно иль нет? И почему?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#895   2009-12-25 15:10 GMT+3 часа(ов)      
Цитата
Alex :> Ты где это прочитал?
Что тебя конкретно не устраивает? С чем ты не согласен?
Вот еще пример:
(define (my-set! qvar qval)
(eval `(define ,qvar ,qval)))
;test
(my-set! 'x 5)
x ;==> 5
(my-set! 'y '(+ x 2))
y ;==> 7



Ленивые вычисления - это непросто отложенные вычисления, а отложенные до первого вызова. Т.е. вычисления происходят только когда это необходимо.
Например,
(define (fibonacci n)
(if (< n 2)
1
(+ (fibonacci (- n 1)) (fibonacci (- n 2)))))
 
(define lazy-fib38 (delay (fibonacci 38))) ; А что так быстро, где вычисления?
(define lazy-fib35 (delay (fibonacci 35))) ; А что так быстро, где вычисления?
(define lazy-fib36 (delay (fibonacci 36))) ; А что так быстро, где вычисления?
(define lazy-fib37 (delay (fibonacci 37))) ; А что так быстро, где вычисления?
 
(define (fib-numbers n)
(cond
((> n 38) (display "Too Big number!!!") (newline))
((= n 35) (write (force lazy-fib35)))
((= n 36) (write (force lazy-fib36)))
((= n 37) (write (force lazy-fib37)))
((= n 38) (write (force lazy-fib38)))
(else (write (fibonacci n)))))
> (fib-numbers 37) ; пауза:)
39088169
> (fib-numbers 37) ; А что так быстро, где вычисления?
39088169
> (fib-numbers 37) ; А что так быстро, где вычисления?
39088169
 

По сути, delay - это та же lambda, которая сохраняет результат вычисления после первого вызова, а затем далее его просто подставляет.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#896   2009-12-25 15:32 GMT+3 часа(ов)      
Цитата
Alex :
> А как ты назовешь замену стандартных макросов
> сделанных по r5rs на собственные. Вспомни мой set!
Хорошо, в этом случае да. Но почему любое: "Любое использование макросов нарушает чистоту r5rs"?
У меня же должны быть собственные предубеждения
Цитата
Alex :
P.S. (2 + 5) ;==> 7
можно иль нет? И почему?
Чтобы так писать необходимо реализовать новый синтаксический анализатор, и далее через собственный repl работать. Короче, необходимы серьезные знания схемы и синтаксического анализа.
Серьезно, советую реализовать макрос calc:, тем более, что я уже почти все сделал (даже приоритет операторов указал). calc: - это азы синтаксического анализа.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#899   2009-12-25 19:46 GMT+3 часа(ов)      
Я все таки заставил схему глотать подобного рода выражения:
> (look-like  if (-9) ((a = (b = 4)) (9 + 9)) else (a = -1))
18
> b
4
> (look-like if (-9) ((a = (b = 14)) (9 + 9)) else (a = -1))
18
> a
14
> b
14
> (look-like if (-9) ((a = (b = 4)) (c = d = 9 + 9)) else (a = -1))
18
> c
18
> b
4
> d
18
> a
4
> (look-like if (0) ((a = (b = 4)) (c = d = 9 + 9)) else (a = -1))
-1
> a
-1
> b
4
> (look-like if (a) ((a = (b = 4)) (c = d = 9 + 9)) else (a = -1))
18
> a
4
 

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#906   2009-12-26 01:33 GMT+3 часа(ов)      
> Ленивые вычисления - это непросто отложенные вычисления,
> а отложенные до первого вызова.
Я не говорил про ленивые вычисления, я сказал, что считаю, что макросы, написанные по r5rs - это ленивые функции. И дальше я объяснил, что именно я под этим понимаю: возможность отложить вычисление аргументов, т.е. не писать лишний раз quote.

> Чтобы так писать необходимо реализовать новый синтаксический
> анализатор, и далее через собственный repl работать.
Почему нельзя без всего этого?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#907   2009-12-26 02:10 GMT+3 часа(ов)      
Цитата
Alex :
> Ленивые вычисления - это непросто отложенные вычисления,
> а отложенные до первого вызова.
Я не говорил про ленивые вычисления, я сказал, что считаю, что макросы, написанные по r5rs - это ленивые функции. И дальше я объяснил, что именно я под этим понимаю: возможность отложить вычисление аргументов, т.е. не писать лишний раз quote.
Давай лучше разберемся. Если макросы называть ленивыми, то и функции придется называть ленивыми, а схема, как потомок лиспа, изначально не является ленивым языком. Т.е. абсурд получается. Макрос - это прежде всего функция аргументы которой предварительно не вычисляются. Макрос их сам обрабатывает.
Цитата
Alex :
> Чтобы так писать необходимо реализовать новый синтаксический
> анализатор, и далее через собственный repl работать.
Почему нельзя без всего этого?
По сути, ты предложил написать новый диалект. Тебе необходимо переписать функцию eval - сердце схемы.

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#909   2009-12-26 02:55 GMT+3 часа(ов)      
> Если макросы называть ленивыми, то и функции придется называть
> ленивыми
Почему?

> Макрос - это прежде всего функция аргументы которой предварительно
> не вычисляются
Именно это я и имел ввиду под фразой "отложить вычисление аргументов".

> По сути, ты предложил написать новый диалект.
Я всеголишь спросил можно или нет, и почему?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#910   2009-12-26 03:30 GMT+3 часа(ов)      
Цитата
Alex :
> Макрос - это прежде всего функция аргументы которой предварительно
> не вычисляются
Именно это я и имел ввиду под фразой "отложить вычисление аргументов".

Так надо было говорить с самого начала
Цитата
Alex :
> Если макросы называть ленивыми, то и функции придется называть
> ленивыми
Почему?

Я же сказал: макрос - это прежде всего функция... Это и имелось ввиду
Цитата
Alex :
> По сути, ты предложил написать новый диалект.
Я всеголишь спросил можно или нет, и почему?

Судя по моим высказываниям - Но это не так просто.

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#911   2009-12-26 06:11 GMT+3 часа(ов)      
> Так надо было говорить с самого начала
В чем разница?

>>макросы, написанные по r5rs - это ленивые функции.
> Если макросы называть ленивыми, то и функции придется называть
> ленивыми
> Я же сказал: макрос - это прежде всего функция...
Я ничего не понял.

> Судя по моим высказываниям - yes Но это не так просто.
По каким твоим высказываниям следует, что можно ввести в repl (не "свой", а "схемовский") выражение (2 + 5) и то, что оно вычислится в 7?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#912   2009-12-26 14:02 GMT+3 часа(ов)      
Цитата
Alex :
> Судя по моим высказываниям - yes Но это не так просто.
По каким твоим высказываниям следует, что можно ввести в repl (не "свой", а "схемовский") выражение (2 + 5) и то, что оно вычислится в 7?

У меня такое ощущение, что ты задаешь вопросы уже имея свои собственные ответы. Твой код будет всего лишь надстройкой поверх схемы, вычислять то придется ей, а из собственного repl, если необходимо, можно реализовать выход. Лень писать? так и скажи
Цитата
Alex :
> Так надо было говорить с самого начала
В чем разница?

>>макросы, написанные по r5rs - это ленивые функции.
> Если макросы называть ленивыми, то и функции придется называть
> ленивыми
> Я же сказал: макрос - это прежде всего функция...
Я ничего не понял.

Ты применил термин ленивые функции к не ленивым макросам, поэтому по аналогии - функции так же ленивы.

отредактировал(а) misha: 2009-12-26 14:10 GMT+3 часа(ов)

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#913   2009-12-26 14:15 GMT+3 часа(ов)      
Может тебе необходимо использовать подобные синтаксические конструкции только внутри lambda и define? Так это же еще проще. Реализуй свои версии define и lambda.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#916   2009-12-26 17:41 GMT+3 часа(ов)      
Чуток исправил i: и вот результат:
> (format-infix: 6 + (4 * 5 + 8) * 7 + 23)
(+ (+ 6 (* (+ (* 4 5) 8) 7)) 23)
> (eval (format-infix: 6 + (4 * 5 + 8) * 7 + 23))
225

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#918   2009-12-26 18:09 GMT+3 часа(ов)      
>>> Судя по моим высказываниям - yes Но это не так просто.
>> По каким твоим высказываниям следует, что можно ввести в repl
>> (не "свой", а "схемовский") выражение (2 + 5) и то, что оно
>> вычислится в 7?
> Твой код будет всего лишь надстройкой поверх схемы,
> вычислять то придется ей, а из собственного repl,
> если необходимо, можно реализовать выход.
> Лень писать? так и скажи
Значит не следует. Значит нельзя?

> Ты применил термин ленивые функции
Правильно, и дальше объяснил, что именно я под этим понимаю.

> Может тебе необходимо использовать подобные синтаксические
> конструкции только внутри lambda и define?
Нет. Я уже наверное раза три сказал, что мне нужно.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#923   2009-12-27 01:00 GMT+3 часа(ов)      
Если честно, то что ты предложил (2 + 5) - издевательство над схемой.
Так как ты хочешь реализовать нельзя.
А вот мне интересно сможешь ли ты реализовать format-infix:? А то как-то странно получается, я с тобой общаюсь как с опытным схимером, а ты только задаешь вопросы. Давай впредь обсуждать код.
Я жду от тебя код format-infix:
> (format-infix: 6 + (4 * 5 + 8) * 7 + 23)
(+ (+ 6 (* (+ (* 4 5) 8) 7)) 23)

Alex

Members


Статус

54 сообщений

Где: Belarus Александранск
Род занятий:
Возраст: 29

#933   2009-12-27 23:09 GMT+3 часа(ов)      
> Так как ты хочешь реализовать нельзя.
Почему?

> А вот мне интересно сможешь ли ты реализовать format-infix:?
Опиши подробнее как оно должно работать. Например, учитывать ли приоритет операторов, если да, то приведи список всех операторов в порядке возрастания приоритета. Или ты имеешь ввиду только арифметические операторы? А то получается реализуй то не знаю что.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#940   2009-12-28 00:44 GMT+3 часа(ов)      
Цитата
Alex :
> Так как ты хочешь реализовать нельзя.
Почему?

Так как ты хочешь у меня выходит только через repl.
Цитата
Alex :
> А вот мне интересно сможешь ли ты реализовать format-infix:?
Опиши подробнее как оно должно работать. Например, учитывать ли приоритет операторов, если да, то приведи список всех операторов в порядке возрастания приоритета. Или ты имеешь ввиду только арифметические операторы? А то получается реализуй то не знаю что.

Если ты сможешь реализовать + - * /, то остальные добавить не составит и труда. Тем более что я уже это реализовал выше Тебе остается чуток изменить мой код и готово.
Если справишься реализуй еще и format-define:
>(format-define: (abc x y)
(if (+ x y x)
(+ 7 8 (- 4 5 6)(8 - 9 + 8 * 7) (- 6 7) 9 (8 - 9 + 8 * 7) 7))
(- 7 (+ 8 9) y)
(+ 5 6 (8 + 7 * 3) 5))
; результат:
(define (abc x y)
(if (+ x y x)
(+ 7 8 (- 4 5 6) (+ (- 8 9) (* 8 7)) (- 6 7) 9
(+ (- 8 9) (* 8 7)) 7))
(- 7 (+ 8 9) y)
(+ 5 6 (+ 8 (* 7 3)) 5))
> (format-define: (read-next input-port)
;(list->string
(let f ()
(let ((c (peek-char input-port)))
(cond
((eof-object? c) '())
((char-alphabetic? c)
(read-char input-port)
(cons c (f)))
(else '())))));)
; результат:
(define (read-next input-port)
(let f ()
(let ([c (peek-char input-port)])
(cond
[(eof-object? c) '()]
[(char-alphabetic? c) (read-char input-port) (cons c (f))]
[else '()]))))

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#942   2009-12-28 01:01 GMT+3 часа(ов)      
И чуть не забыл Главное чтобы хоть как-то работало.
Пойми, ты спрашиваешь почему нельзя реализовать, а никаких усилий с твоей стороны я не вижу. Т.е. типа мне это нужно
Я считаю, что если ты сам не попробуешь реализовать, то все мои попытки объяснить тщетны.


Онлайн :

0 пользователь(ей), 40 гость(ей) :




Реклама на сайте: