> 1 <

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

DarkEld3r

Members


Статус

18 сообщений

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

#7151   2013-11-02 23:41 GMT+3 часа(ов)      
Привет.

Возникло желание Racket освоить, туториалы их посмотрел, но хочется более системного подхода. У них на сайте рекомендуют "How to Design Programs" - отзывы по книге неплохие, в принципе, плюс доступна бесплатно. Правда смущает, что это всё-таки, что книга несколько более общей направленности и, насколько я понял, не все "новые фичи" ракета используются.

Ещё наткнулся на "Realm of racket". Посмотрел немного... она похоже для совсем начинающих, плюс подача материала своеобразная. Может кто-то читал и может сказать стоит ли время тратить?

Или посоветуйте что-то ещё. Для примера - по лиспу читал раньше "Practical common lisp", понравилось. Правда это давненько было и лисп на практике не применял, так что многое успело подзабыться.

DarkEld3r

Members


Статус

18 сообщений

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

#7152   2013-11-03 17:50 GMT+3 часа(ов)      
Ну и заодно вопрос по typed/racket. Насколько я понял, указание типов там сделано таким образом специально, чтобы его можно было добавить к уже существующему коду без особых изменений. Правда приходится два раза указывать имена (функций, переменных):
(: function-test (Number Number Number -> Void))
(define (function-test a b c)
(display (list a b c)))

Нет ли альтернативной формы, чтобы не повторяться? На сайте есть вот следующий пример, но я вообще не понял, что тут происходит.
(define: (id [z : Number]) : Number z)

misha

Moderators


Статус

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

#7153   2013-11-04 01:02 GMT+3 часа(ов)      
Цитата
Ещё наткнулся на "Realm of racket". Посмотрел немного... она похоже для совсем начинающих, плюс подача материала своеобразная. Может кто-то читал и может сказать стоит ли время тратить?
А это только вам решать) Лично мне понравилась. Сразу видно, что ребята старались.
Цитата
Или посоветуйте что-то ещё.
The Racket Guide
Цитата
Нет ли альтернативной формы, чтобы не повторяться? На сайте есть вот следующий пример, но я вообще не понял, что тут происходит.
С паскалем/дельфи не знакомы?

DarkEld3r

Members


Статус

18 сообщений

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

#7154   2013-11-04 02:44 GMT+3 часа(ов)      
misha
А это только вам решать) Лично мне понравилась. Сразу видно, что ребята старались.

В ожидании ответов, уже начал читать. Читается действительно легко, но это отчасти и смутило - книга не сильно обьёмная, а с большим количеством отступлений, картинок и т.д. есть опасение, что многое там просто будет отсутствовать. Я так понимаю, что направленность у книги слегка другая, ну да ладно. Может мне и этого хватит.

=misha
The Racket Guide

Видел, спасибо. Но показалось, что это скорее мануал. В том смысле, что туда стоит заглядывать когда что-то хочется прояснить, а для чтения "от начала до конца" оно плохо подходит.

misha
С паскалем/дельфи не знакомы?

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

misha

Moderators


Статус

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

#7155   2013-11-04 21:31 GMT+3 часа(ов)      
Цитата
Но показалось, что это скорее мануал. В том смысле, что туда стоит заглядывать когда что-то хочется прояснить, а для чтения "от начала до конца" оно плохо подходит.
"The Racket Guide" является базовым курсом. Хоть он и написан довольно хорошо, но читать его следует сначала, а иначе будете постоянно спотыкаться при разборе более сложной темы.

DarkEld3r

Members


Статус

18 сообщений

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

#7156   2013-11-04 22:23 GMT+3 часа(ов)      
Ок, спасибо. Как книгу дочитаю, то к гайду перейду.

И ещё несколько вопросов. Часто в примерах используют символы там где я (по привычке из других языков) использовал бы строки. Скажем простой пример со структурами:
(struct student (name id# dorm))
(define freshman1 (student 'Joe 1234 'NewHall))

Какие есть недостатки (преимущества?) использовать строки вместо символов в данном случае и вообще?

И ещё вопрос насчёт смешивания типизированного и "обычного" вариантов языка. Сначала я думал, что это можно делать без проблем, так как вот такой код работает, хотя типы не указаны:
#lang typed/racket
(define (test a)
a)
(test 1)
(test "test")


А вот так не работает:
#lang typed/racket
(struct test-struct
(a
b
c))


Type Checker: untyped identifier make-struct-type imported from module <(quote #%kernel)> in: (struct test-struct (a b c))

отредактировал(а) DarkEld3r: 2013-11-04 23:07 GMT+3 часа(ов)

misha

Moderators


Статус

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

#7157   2013-11-05 03:29 GMT+3 часа(ов)      
Цитата
Какие есть недостатки (преимущества?) использовать строки вместо символов в данном случае и вообще?
Сначала разберитесь со стандартными функциями сравнения. И я думаю, вопросы отпадут сами собой)
Цитата
И ещё вопрос насчёт смешивания типизированного и "обычного" вариантов языка. Сначала я думал, что это можно делать без проблем
Пока о полной совместимости не может быть и речи. Рассматривайте его как отдельный диалект.

DarkEld3r

Members


Статус

18 сообщений

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

#7158   2013-11-05 15:34 GMT+3 часа(ов)      

Сначала разберитесь со стандартными функциями сравнения. И я думаю, вопросы отпадут сами собой)
Ну сравнение символов быстрее, насколько я вижу... То есть везде где можно стоит использовать именно их?


Пока о полной совместимости не может быть и речи. Рассматривайте его как отдельный диалект.
Совместимость мне и не нужна (вроде). Разве что интересно можно ли смешивать оба диалекта в одной программе, но в разных модулях. Потому что, насколько я понимаю, "простой" ракет более популярен.

Интересовало другое - можно ли написать аналог шаблонных функций (как в с++, к примеру). В обычном ракете, как я понимаю, никаких проблем с этим нет, но ошибки типизации будут вылазить в рантайме. А хотелось бы чего-то такого:
(define (test a b)
(+ a b))

Ведь для своих классов плюс можно определить, так?
И чтобы оно работало и с числами и со своими классами (сейчас получаю ожидаемые ошибки - "Type Checker: Expected Number, but got Any"). Это возможно?

И ещё один вопрос - вижу, что вы хорошо в этом всём разбираетесь и, по всей видимости, следите за развитием языка. Насколько вообще typed racket востребован? Или основные усилия уделяются "обычному" варианту?

misha

Moderators


Статус

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

#7159   2013-11-07 02:16 GMT+3 часа(ов)      
Цитата
Ну сравнение символов быстрее, насколько я вижу... То есть везде где можно стоит использовать именно их?
Желательно использовать символы в качестве идентификаторов, ключей.
Цитата
Интересовало другое - можно ли написать аналог шаблонных функций (как в с++, к примеру). В обычном ракете, как я понимаю, никаких проблем с этим нет, но ошибки типизации будут вылазить в рантайме.
Да вот только появляются подобные ошибки у меня почему-то крайне редко. В основном только при рефакторинге.
Цитата
Ведь для своих классов плюс можно определить, так?
И чтобы оно работало и с числами и со своими классами (сейчас получаю ожидаемые ошибки - "Type Checker: Expected Number, but got Any"). Это возможно?
Используйте объединения типов.
Цитата
И ещё один вопрос - вижу, что вы хорошо в этом всём разбираетесь и, по всей видимости, следите за развитием языка. Насколько вообще typed racket востребован? Или основные усилия уделяются "обычному" варианту?
Сейчас спрос на typed racket невелик. Его в основном рассматривают как экспериментальный язык. Лично я жду пока в него добавят типизированные макросы, конечно, если это вообще планируется.

DarkEld3r

Members


Статус

18 сообщений

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

#7160   2013-11-07 17:04 GMT+3 часа(ов)      

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


Используйте объединения типов.
Если я правильно понял, то все типы в обьединении надо заранее указать. В таком случае, это не то, что мне нужно. В идеале ведь такая функция пишется один раз и выносится в библиотеку - не модифицировать же её каждый раз как появляется новый тип, который можно туда передать.
Нагуглил, что есть racket/generic. По идее, как раз то, что мне нужно? Правда не понял будет ли оно с typed racket работать? Если да и если не сложно, то можно пример, а то я что-то не разобрался.

И всё-таки - можно из typed racket вызывать функции "обычного" raket? Или просто так готовыми библиотеками пользоваться не получится?

И ещё один вопрос - тип Nothing для чего вообще нужен?
Была мысль, что это как void в С, потому что в ракете можно создавать переменные типа void. Но как вернуть Nothing из функции?

misha

Moderators


Статус

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

#7164   2013-11-07 19:33 GMT+3 часа(ов)      
Цитата
Скажем так, у меня больше опыта в статически типизированных языках, ну и свои привычки тащу сюда.
Значит у вас будет долгий и мучительный процесс ломки стереотипов.
Цитата
Если я правильно понял, то все типы в обьединении надо заранее указать. В таком случае, это не то, что мне нужно. В идеале ведь такая функция пишется один раз и выносится в библиотеку - не модифицировать же её каждый раз как появляется новый тип, который можно туда передать.
Тогда используйте полиморфные функции. Но объединения лучше, т.к. при неправильном определении полиморфной функции компилятор может пропустить ошибки типизации. Поэтому необходимо особо тщательно все продумать перед созданием полиморфного типа или функции.
Цитата
Нагуглил, что есть racket/generic. По идее, как раз то, что мне нужно? Правда не понял будет ли оно с typed racket работать? Если да и если не сложно, то можно пример, а то я что-то не разобрался.
Это не то, что вам нужно.
Цитата
И всё-таки - можно из typed racket вызывать функции "обычного" raket? Или просто так готовыми библиотеками пользоваться не получится?
Используйте require/typed.
Цитата
И ещё один вопрос - тип Nothing для чего вообще нужен?
Была мысль, что это как void в С, потому что в ракете можно создавать переменные типа void. Но как вернуть Nothing из функции?
Void также является типом значения. Используйте Nothing для функций, которые никогда не возвращают значения.

DarkEld3r

Members


Статус

18 сообщений

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

#7174   2013-11-07 20:51 GMT+3 часа(ов)      

Значит у вас будет долгий и мучительный процесс ломки стереотипов.
Но зачем? Да и какой-никакой опыт лиспов (пусть и сугубо теоретический) у меня уже был... Тут ведь дело в том, что ракет может предложить типизацию. А раз может, то почему бы не пользоваться, если (мне) удобно.


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


Используйте require/typed.
Правильно ли я понимаю, что в require/typed надо перечислять, что именно "импортируется" и какие типы будут передаваться?


Тогда используйте полиморфные функции.
К сожалению, не понял, что тут подразумевается... Можно уточнить?
Была мысль, что это функции из "обычного ракета", но обьявлять их нельзя если используется "#lang typed/racket". А через require/typed типы опять же надо жестко задавать.


Void также является типом значения. Используйте Nothing для функций, которые никогда не возвращают значения.
Здесь что-то типа (exit) подразумевается?
То есть это аналог noreturn для с/с++?

misha

Moderators


Статус

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

#7175   2013-11-07 23:10 GMT+3 часа(ов)      
Цитата
Но зачем? Да и какой-никакой опыт лиспов (пусть и сугубо теоретический) у меня уже был... Тут ведь дело в том, что ракет может предложить типизацию. А раз может, то почему бы не пользоваться, если (мне) удобно.
Typed racket базируется на racket, поэтому вам необходимо сначала разобраться с ним. Поймите, все нужно делать постепенно - шаг за шагом. (Я уже не знаю как вам объяснить) Короче, если не поймете racket, то использование typed racket превратится для вас в мороку. Да и, вывод типов в typed racket имеет свои нюансы, аналога которых нет в C/C++.
Цитата
Предполагаю, что вам известно как работают шаблоны С++ - проверка типов во время компиляции происходит, но типы указывать не надо. Вот аналог такой возможности хотелось бы увидеть. То есть новый код может работать с ранее написанными функциями без модификации (добавления типа в обьединение).
(define: (T) (sum args : T *) : T
(apply + args))
 
(define: (T) (mklist args : T *) : (Listof T)
args)
 
(define: (A B) (mkcons [a : A][b : B]) : (Pair A B)
(cons a b))

Цитата
Правильно ли я понимаю, что в require/typed надо перечислять, что именно "импортируется" и какие типы будут передаваться?
Необходимо вручную указывать типы импортируемых определений.
Цитата
К сожалению, не понял, что тут подразумевается... Можно уточнить?
См. примеры полиморфных функций выше.
Цитата
Здесь что-то типа (exit) подразумевается?
То есть это аналог noreturn для с/с++?
exit возвращает значение. noreturn не является типом. Nothing будут иметь функции с бесконечным циклом, генерирующие исключение, вызывающие продолжение и т.п.

DarkEld3r

Members


Статус

18 сообщений

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

#7177   2013-11-08 00:08 GMT+3 часа(ов)      
Большое спасибо за ответы. Вероятно, часто я глупости спрашиваю, иногда даже сам это понимаю. И нормально почитать гайд собираюсь. Да, сейчас читаю книгу и часто забегаю вперёд... ну что поделать, сложно игнорировать ряд интересных вопросов. Тем более так лучше интерес к изучению поддерживается. В "realm of racket" ведь не тайпед ракет, так что я просто параллельно пытаюсь тот же результат и привычные в других языках вещи на типизированном диалекте изобразить.


exit возвращает значение. noreturn не является типом. Nothing будут иметь функции с бесконечным циклом, генерирующие исключение, вызывающие продолжение и т.п.

Ну значит идею я правильно понял.
Насчёт noreturn - ну да, это не тип, так как в С void и так уже ничего не возвращает - такая ситуация в ракете, насколько понимаю, редкость. Но смысл примерно такой же - сказать, что функция нормально не завершится.
С exit действительно недосмотрел.

За пример полиморфных функций отдельное спасибо. Жаль, что там проверки (как минимум часть?) уже в рантайме будут:
(define: (T) (sum-2 [a : T] [b : T]) : T
(apply + (list a b)))
 
(define (test-sum)
(sum-2 "aaa" "bbb"))

Ну хоть количество аргументов проверяется... Кстати, без "apply" даже с фиксированным количеством аргументов не обойтись (у меня не получилось)?

misha

Moderators


Статус

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

#7178   2013-11-08 01:35 GMT+3 часа(ов)      
Цитата
Ну хоть количество аргументов проверяется... Кстати, без "apply" даже с фиксированным количеством аргументов не обойтись (у меня не получилось)?
Так ведь apply имеет полиморфный тип, а + нет.

DarkEld3r

Members


Статус

18 сообщений

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

#7179   2013-11-10 05:35 GMT+3 часа(ов)      
Понятно...

И ещё несколько вопросов:
Дошел до тестов (rackunit), посмотрел в Racket/collects в поиске примеров. Там часто встречается нечто такое:
(module+ test
(require rackunit)
; Tests...
...)

Я так понимаю, что тесты в отдельный модуль выносятся. Собственно вопросы:
1. Будут ли тесты видны "снаружи"? В смысле подключаю библиотеку - до её тестов добраться могу? Или этот вопрос отпадёт, когда про модули почитаю? Подозреваю, что не всё из модуля экспортируется.
2. Проверяются ли тесты в момент подключения библиотеки? Скажем, если я делаю "(require mega-module)" и в "mega-module" есть тесты, то будут ли они проверяться в какой-то момент?

И ещё один вопрос насчёт функции "command-line". Документацию тут читал, но что-то не пойму - можно ли сделать параметр обязательным? В смысле, что если его нет, то выдавалось бы сообщение об ошибке. Понятно, что самому это сделать несложно, но приятно удивилo, что там и хелп сам генерится, вот и ожидаю, что такой простой случай тоже предусмотрен.

misha

Moderators


Статус

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

#7182   2013-11-17 14:11 GMT+3 часа(ов)      
Цитата
1. Будут ли тесты видны "снаружи"? В смысле подключаю библиотеку - до её тестов добраться могу? Или этот вопрос отпадёт, когда про модули почитаю? Подозреваю, что не всё из модуля экспортируется.
В примере используются подмодули, чтобы их использовать вам необходимо еще их дополнительно подгружать. Т.е. ваши тесты как бы изолированы от остального кода, но вы всегда можете к ним добраться.
Цитата
2. Проверяются ли тесты в момент подключения библиотеки? Скажем, если я делаю "(require mega-module)" и в "mega-module" есть тесты, то будут ли они проверяться в какой-то момент?
При использовании подмодулей(rtfm) тесты проверяться не будут.
Цитата
И ещё один вопрос насчёт функции "command-line". Документацию тут читал, но что-то не пойму - можно ли сделать параметр обязательным?
Нет, т.к. обычно параметры не обязательны по определению. Если вам нужен специальный синтаксис, тогда лучше парсить вручную.

DarkEld3r

Members


Статус

18 сообщений

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

#7186   2013-11-17 21:55 GMT+3 часа(ов)      
И снова спасибо за ответы.


Нет, т.к. обычно параметры не обязательны по определению
Ну тут можно поспорить... но к делу это не относится. Жаль.

И ещё один вопрос - в racket вообще можно для своего типа определить (или "перегрузить" в терминах того же С++) уже существующую функцию (например "+")? Или это невозможно?

misha

Moderators


Статус

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

#7189   2013-11-18 18:53 GMT+3 часа(ов)      
Цитата
И ещё один вопрос - в racket вообще можно для своего типа определить (или "перегрузить" в терминах того же С++) уже существующую функцию (например "+")? Или это невозможно?
У рэкета нет функций, есть только переменные. Надеюсь, намек поняли.

DarkEld3r

Members


Статус

18 сообщений

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

#7220   2014-01-07 07:21 GMT+3 часа(ов)      
После долгого промежутка, снова я с порцией вопросов.

Вот есть такая функция:
(directory-list [path #:build? build?]) &&#358594; (listof path?)

Но в typed/racket она похоже без дополнительного аргумента:
> (:print-type directory-list)
(case-> (-> (Listof Path))
(Path-String -> (Listof Path)))

Очень странно, на мой взгляд. Этому какая-то причина есть или просто оплошность? Потому что делаю так и всё работает (вроде):
(require/typed racket/base
[directory-list (String #:build? Boolean -> (Listof Path))])

Правда я так и не пнял как дефолтное значение аргументу при этом задать. Это возможно?

Ещё очень печально, что подмодули для тайпед ракета не работают до сих пор.

отредактировал(а) DarkEld3r: 2014-01-07 07:32 GMT+3 часа(ов)

misha

Moderators


Статус

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

#7229   2014-01-10 17:58 GMT+3 часа(ов)      
Цитата
Очень странно, на мой взгляд. Этому какая-то причина есть или просто оплошность?
Просто еще не успели реализовать! Вам придется подождать пока они case-> доведут до ума.
Цитата
Потому что делаю так и всё работает (вроде):
А вот так будет еще лучше:
[directory-list (String [#:build? Boolean] -> (Listof Path))]

Цитата
Правда я так и не пнял как дефолтное значение аргументу при этом задать. Это возможно?
В этом нет необходимости. Научитесь правильно определять тип.

DarkEld3r

Members


Статус

18 сообщений

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

#7233   2014-01-13 18:34 GMT+3 часа(ов)      
Спасибо.

И ещё один вопрос - как из обьединения правильно один тип вытащить? Всякие функции преобразования возвращают обьединение тип/Bool.
(define: (int-from-string [value : String]) : Integer
(let ([result (string->number value)])
(if (integer? result)
result ; <====================== ???
(raise "Error"))))

Что там написать?

DarkEld3r

Members


Статус

18 сообщений

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

#7234   2014-01-14 03:52 GMT+3 часа(ов)      
Кажется нашел (cast).

Правда теперь заcтрял на следующем моменте:
(define: (test-for [value : String]) : Void
(for: ([character : Char value]
#:break #f)
(display character)))

Получаю ошибку:

Type Checker: Error in macro expansion -- insufficient type information to typecheck. please add more type annotations in: (for: ((character : Char value) #:break #f) (display character))

Куда (и как) аннотации типов добавить не понимаю...

отредактировал(а) DarkEld3r: 2014-01-14 05:13 GMT+3 часа(ов)

misha

Moderators


Статус

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

#7236   2014-01-16 22:47 GMT+3 часа(ов)      
Цитата
Правда теперь заcтрял на следующем моменте:
for: еще не поддерживает #:break.

PS rtfm - универсальный ответ)

DarkEld3r

Members


Статус

18 сообщений

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

#7242   2014-01-20 05:00 GMT+3 часа(ов)      
Спасибо. "Мануал" читал, но "не мог в это поверить". Плюс зацепился взглядом за предложение "These behave like their non-annotated counterparts.", которое там тоже есть.

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

misha

Moderators


Статус

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

#7243   2014-01-22 01:40 GMT+3 часа(ов)      
Цитата
"Мануал" читал, но "не мог в это поверить".
Цикл for довольно-таки сложно обработать, поэтому его аналог пока не может ему полностью соответствовать. Да и сам for активно развивается, так что неизвестно будет ли достигнута полная аналогия.
Цитата
Вообще хотел написать функцию возвращающую первое встреченное число в строке. В итоге использовал регулярные выражения - получилось куда короче и проче того ужаса, что написал изначально.
А я еще помню времена, когда приходилось использовать сторонние библиотеки для использования регулярных выражений.

misha

Moderators


Статус

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

#7244   2014-01-22 01:44 GMT+3 часа(ов)      
Я думаю, вам стоит создать отдельную тему для вопросов по typed racket.
> 1 <


Онлайн :

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




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