> 1 <

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

isource

Members


Статус

13 сообщений

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

#2565   2010-06-24 00:17 GMT+3 часа(ов)      
Наинжинирил следующее:
 
#lang racket
 
(require "tree.rkt")
 
(define words (make-plain-tree string<?))
 
(define (collect dictionary)
(let ((input (read-line))) ;; <-- ???
(cond ((not (or (string=? input "exit") (string=? input "quit")))
(collect (t-insert dictionary input #t)))
(else dictionary))))
 
(t-search (collect words) "secret") ; check result
 


Вместо главного цикла - рекурсия. Думаю, понятно, вызывает без конца саму себя да ещё и с параметром, где хранится текущее состояние дел, зависящее от ввода пользователя. И меня очень волнует - не будет ли оно несчадно хавать память на машине (будет ли GC собирать устаревшие состояния дел, ведь они являются параметрами в вызвавших функциях)? Ещё больше волнует let (оно в стек переменную input кладёт, как понимаю), будет ли оно и её подчищать. Формально всё работает - нужно ли беспокоится о подобных вещах, как байтики?

ander-skirnir

Members


Статус

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

#2568   2010-06-24 02:19 GMT+3 часа(ов)      
Да это же хвостатая рекурсия, она развернётся в обычный цикл.
Ну и замените cond на if.

utkin

Members


Статус

21 сообщений

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

#2569   2010-06-24 11:18 GMT+3 часа(ов)      
Раньше if был через cond написан, вроде. Разве сейчас ситуация иная? В смысле не поменяет ли он шило на мыло?

misha

Moderators


Статус

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

#2570   2010-06-24 11:23 GMT+3 часа(ов)      
>Да это же хвостатая рекурсия, она развернётся в обычный цикл.
А может и не развернется), но будет замещать вершину (tos) стека возвратов. Впрочем, это и на cil можно организовать.

>Ещё больше волнует let(оно в стек переменную input кладёт, как понимаю), будет ли оно и её подчищать.
Конечно будет) let по сути ((lambda (arg ...) ...) value ...)

misha

Moderators


Статус

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

#2571   2010-06-24 11:27 GMT+3 часа(ов)      
Цитата
utkin :
Раньше if был через cond написан, вроде. Разве сейчас ситуация иная? В смысле не поменяет ли он шило на мыло?

Замена на if позволяет избавится от not.

isource

Members


Статус

13 сообщений

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

#2586   2010-06-24 22:47 GMT+3 часа(ов)      
>Да это же хвостатая рекурсия, она развернётся в обычный цикл.
А как определять, развернётся в цикл или нет? Или хотя бы
> будет замещать вершину (tos) стека возвратов
, что я представляю себе чуть лучше.

> Конечно будет) let по сути ((lambda (arg ...) ...) value ...)
Ну а если я напишу так:
 
(define (collect dictionary)
(let ((input (read-line)))
(cond ((not (or (string=? input "exit") (string=? input "quit")))
(collect (t-insert dictionary input #t))
(display input)) ; <-- other use of input
(else dictionary))))
 

То есть я использую input, и оно будет с ним ещё что-то делать после "возвращении рекурсии назад". Или оно как-то вычисляет, что мы переменную больше использовать в будущем не собираемся?

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 5

#2588   2010-06-25 00:26 GMT+3 часа(ов)      
Цитата
Раньше if был через cond написан, вроде. Разве сейчас ситуация иная?

http://www.lispworks.com/documentation/HyperSpec/Body/s_if.htm
http://www.lispworks.com/documentation/HyperSpec/Body/m_cond.htm
Иная.
Добавлено:
Извиняюсь
vvv

отредактировал(а) Fallen_s4e: 2010-06-25 01:57 GMT+3 часа(ов)

Михаил

Members


Статус

120 сообщений

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

#2590   2010-06-25 01:19 GMT+3 часа(ов)      
Цитата
Fallen_s4e :
Цитата
Раньше if был через cond написан, вроде. Разве сейчас ситуация иная?

http://www.lispworks.com/documentation/HyperSpec/Body/s_if.htm
http://www.lispworks.com/documentation/HyperSpec/Body/m_cond.htm
Иная.

У нас тут scheme, понимаешь. И какая разница, что через что написано, if через cond или наоборот? В стандарте об этом ничего не сказано: разработчики имеют право реализовывать это дело как захотят.

Михаил

Members


Статус

120 сообщений

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

#2591   2010-06-25 01:26 GMT+3 часа(ов)      
Цитата
isource :
>Да это же хвостатая рекурсия, она развернётся в обычный цикл.
А как определять, развернётся в цикл или нет? Или хотя бы
> будет замещать вершину (tos) стека возвратов
, что я представляю себе чуть лучше.

> Конечно будет) let по сути ((lambda (arg ...) ...) value ...)
Ну а если я напишу так:
 
(define (collect dictionary)
(let ((input (read-line)))
(cond ((not (or (string=? input "exit") (string=? input "quit")))
(collect (t-insert dictionary input #t))
(display input)) ; <-- other use of input
(else dictionary))))
 

То есть я использую input, и оно будет с ним ещё что-то делать после "возвращении рекурсии назад". Или оно как-то вычисляет, что мы переменную больше использовать в будущем не собираемся?

Про хвостовую рекурсию:
http://www.schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-6.html#%_sec_3.5

misha

Moderators


Статус

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

#2594   2010-06-25 01:45 GMT+3 часа(ов)      
>Или оно как-то вычисляет, что мы переменную больше использовать в будущем не собираемся?
Сборка мусора

misha

Moderators


Статус

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

#2596   2010-06-25 01:53 GMT+3 часа(ов)      
Вспомним самый старый стандарт - RRS (Revised Report on Scheme):

Catalogue of Magic Forms
Kernel Magic Forms


lambda, if, quote, labels
Side Effects

define, aset'

Dynamic Magic

fluidbind, fluid, fluidset', static, catch

Syntactic Extensions
System-Provided Extensions


block, let, do, iterate, test, cond, or, and, amapcar, amaplist, amapc, prog?

User-Provided Extensions

schmac, macro

Primitive SCHEME Functions

procp, enclose?, create!process?, start!process?, terminate?

isource

Members


Статус

13 сообщений

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

#2598   2010-06-25 02:00 GMT+3 часа(ов)      
Спасибо, но стало понятно, что ещё больше непонятно (континуации - не представляю даже что это).

Но вроде бы исходя из ссылки код не свернётся, поскольку "хвостовой контекст" есть только после else у cond

> (cond <cond clause>* (else <tail sequence>))

Поменял строки местами, заодно избавился от not.

misha

Moderators


Статус

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

#2599   2010-06-25 02:07 GMT+3 часа(ов)      
>континуации - не представляю даже что это
Это моя любимая фишка)

>Но вроде бы исходя из ссылки код не свернётся, поскольку "хвостовой контекст" есть только после else у cond
Свернётся!)
> 1 <


Онлайн :

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




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