Предыдущая страница [1] > 2 <

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

misha

Moderators


Статус

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

#3516   2010-11-19 14:50 GMT+3 часа(ов)      
> Ну, call-by-need и call-by-name - это небольшие его модификации.
call-by-name не характерен для нормального порядка редукции.

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3517   2010-11-19 16:08 GMT+3 часа(ов)      
>2) Докажите почему в схеме нормальный порядок редукции.
Он как раз таки говорил, что в схеме его нету. В схеме используется стратегия вызова по значению как и почти везде.

misha

Moderators


Статус

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

#3518   2010-11-19 17:49 GMT+3 часа(ов)      
> В схеме используется стратегия вызова по значению как и почти везде
Вызов по ссылке! Кто из нас схемер?
>(let ([x 1]
[y 2])
((let()
(set! x 10)
(set! y 20)
+)
x y))
30

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3519   2010-11-19 19:02 GMT+3 часа(ов)      
Ну. Так по значению же выходит: сокращаются только самые внешние редексы + мутабельность возможна. Не?

misha

Moderators


Статус

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

#3520   2010-11-19 20:17 GMT+3 часа(ов)      
> (let ([x (cons (lambda n (apply + n)) *)])
(printf "((car x) 1 2 3) = ~a\n((cdr x) 1 2 3 4) = ~a"
((car x) 1 2 3) ((cdr x) 1 2 3 4)))
((car x) 1 2 3) = 6
((cdr x) 1 2 3 4) = 24

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3521   2010-11-19 23:16 GMT+3 часа(ов)      
Ну дык call-by-reference - это почти то же самое, что сall-by-value. Мелкие детали, а стратегия та же - аппликативная.

Вот простое доказательно не-нормальности редукции в схеме:
(define (foo x y) x)
(foo 1 (/ 0))
/: division by zero

misha

Moderators


Статус

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

#3522   2010-11-20 00:45 GMT+3 часа(ов)      
> Ну дык call-by-reference - это почти то же самое, что сall-by-value.
call-by-reference - это частный случай сall-by-value. В схеме, однако, присутсвует смешанный тип вызова сall-by-value/call-by-reference.

> Мелкие детали, а стратегия та же - аппликативная.
Почему Вы считаете, что сall-by-value является её явным признаком? А как же call-by-macro-expansion?

> Вот простое доказательно не-нормальности редукции в схеме:
Сдается мне Вы приписываете нормальному порядку ленивые свойства.
Повторю вопрос: Приведите последовательности шагов для нормального и ленивого порядка редукции характерные для следующего фрагмента кода
(let* ((x (+ 10 6))
(y (* x 2)))
(+ x y 8))

отредактировал(а) misha: 2010-11-20 01:06 GMT+3 часа(ов)

misha

Moderators


Статус

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

#3523   2010-11-20 01:32 GMT+3 часа(ов)      
> Почему Вы считаете, что сall-by-value является её явным признаком? А как же call-by-macro-expansion?
Попробую реализовать call-by-name.

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3524   2010-11-20 05:01 GMT+3 часа(ов)      
>Попробую реализовать call-by-name.
В СИКПе есть, раздел 4.2.

misha

Moderators


Статус

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

#3525   2010-11-20 05:26 GMT+3 часа(ов)      
(define-syntax (call-by-name so)
(syntax-case so ()
[(_ fun e ...)
#`(fun #,@(datum->syntax so
(map (lambda(e) `(lambda () ,e))
(syntax->list #'(e ...)))))]
[(_ fun) #'(fun)]))
 
(define-syntax (lambda-call-by-name so)
(syntax-case so ()
[(_ (formals ...) body ...)
(with-syntax
([args (datum->syntax so
(map (lambda (arg)
`(,arg (,arg)))
(syntax->list #'(formals ...))))])
#'(lambda (formals ... . temp) (let args body ...)))]
[(_ (formals ... . rest) body ...)
(with-syntax
([args (datum->syntax so
`((,#'rest (map (lambda (arg) (arg))
,#'rest))
,@(map (lambda (arg)
`(,arg (,arg)))
(syntax->list #'(formals ...)))))])
#'(lambda (formals ... . rest) (let args body ...)))]
[(_ formals body ...)
(if (identifier? #'formals)
(with-syntax
([args (datum->syntax so
`(,#'formals
(map (lambda (arg) (arg))
,#'formals)))])
#'(lambda formals (let args body ...)))
(raise-syntax-error 'defun-call-by-name "Good job!"))]))
 
(define-syntax (defun-call-by-name so)
(syntax-case so ()
[(_ id formals body ...)
(let ([name
(lambda (stx-name)
(datum->syntax so
(string->symbol (format "~a::call-by-name"
(syntax->datum stx-name)))))])
(if (identifier? #'id)
(if (identifier-binding #'id)
#`(define #,(name #'id)
(lambda-call-by-name formals body ...))
#`(begin
(define #,(name #'id)
(lambda-call-by-name formals body ...))
(define-syntax id
(lambda (stx)
(datum->syntax stx `(call-by-name #,(name #'id)
,@(cdr (syntax->list stx))))))))
(raise-syntax-error 'defun-call-by-name "Good job!")))]))

> (defun-call-by-name x (n) (+ n 3))
(defun-call-by-name y (n) (x n 1 2 3))
> (y 1 2 3 4)
4
> (y 1 2 3 (/ 0))
4
> (defun-call-by-name x n n)
> (y 1 2 3 (/ 0))
'(1 1 2 3)

отредактировал(а) misha: 2010-11-21 04:31 GMT+3 часа(ов)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3526   2010-11-20 11:33 GMT+3 часа(ов)      
Делал как-то на cl, без гигиены, да с symbol-macrolet'ом гораздо проще получается.

> call-by-macro-expansion
Макросы вообще вредно рассматривать в этом вопросе. Они, по сути, являются ad-hoc перегрузкой бета-конверсии. На них вообще что угодно можно сделать, но это будет либо компайл-тайм, либо eval.


> Сдается мне Вы приписываете нормальному порядку ленивые свойства.
Повторю вопрос

Я лучше для своего примера приведу:
(\x.(\y.x)) 1 ((\x./x) 0)
НПР: -> (\y.1) ((\x./x) 0) -> 1
АПР: -> (\x.(\y.x)) 1 (/0) -> division-by-zero

\ === lambda

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3527   2010-11-20 12:09 GMT+3 часа(ов)      
На пару всё-равно опоздал ):
call-by-name отличается от стандартного нормального порядка одним шагом редукции (вернее, его отсутствием),
call-by-need отличается от call-by-name деталями реализации, вообще не имеющими отношения к порядку редукции,
call-by-reference - это call-by-value, в котором value = reference.

К прошлому посту:
`компайл-тайм' - рантайм функции compile :)

misha

Moderators


Статус

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

#3530   2010-11-21 02:16 GMT+3 часа(ов)      
> Делал как-то на cl, без гигиены, да с symbol-macrolet'ом гораздо проще получается.
На самом деле макросы очень просты и к сожалению не гигиеничны.

> Макросы вообще вредно рассматривать в этом вопросе.

Ну, Вы же утверждали, что лисп плохо подходит для функционального программирования. Но Вы с помощью нескольких макросов способны реализовать все что Вам не хватает. Разве не так?

call-by-name отличается от стандартного нормального порядка одним шагом редукции (вернее, его отсутствием),
Разве он отсутствует?

call-by-reference - это call-by-value, в котором value = reference.

Зачастую компилятор сам выбирает какой тип использовать.

misha

Moderators


Статус

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

#3531   2010-11-21 02:23 GMT+3 часа(ов)      
 
> (call-by-name (lambda-call-by-name (n m) (+ n m)) (+ 1 2) 9 (/ 0))
12

отредактировал(а) misha: 2010-11-21 04:32 GMT+3 часа(ов)


Онлайн :

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