Я хочу дать презентацию Scala, и я хочу сделать это путем взятия приложения и развить ее из чего-то, что использует идиомы Java для чего-то, что использует питание scala (черты, сопоставление с образцом, неявный convertions, функциональное программирование).
Я особенно интересуюсь чем-то, что демонстрирует конструктивное изменение, а не синтаксический сахар. Что-то, где конец scala код очевидно легче поддержать и расшириться.
Так какие-либо идеи? (Я не прошу примеры кода, просто общие представления о том, какой пример использовать и какие принципы разработки могут быть продемонстрированы).
У меня есть оповещения google для html 5 ИЛИ css 3
-121--3238907-Поля в модели представляют только способ хранения данных в базе данных.
Вы можете очень легко ввести максимальную длину в форме, которая будет проверять ввод пользователей. Вот так.
class InputForm(forms.Form):
text = forms.CharField(max_length=16384, widget=forms.TextArea)
...
Это позволит убедиться, что максимальная длина, которую пользователь может успешно ввести, составляет 16k.
-121--4904227-Замечательный пример - разработка маленького интерпретатора для динамического мини-языка.
Базовая реализация Java требует классического интерпретатора проектировать образца , в то время как функциональный scala-подход может использовать много замечательных функциональных идиом, таких как
или, возможно, даже monads , чтобы получить очень чистый и легко понятный код.
Просто сравните
class Number implements Expression {
private int number;
public Number(int number) { this.number = number; }
public int interpret(HashMap<String,Integer> variables) { return number; }
}
с
case NumberLiteral(i) => Integer(i)
См. примеры интерпретаторов на странице scala .
Чтобы помочь вам выбрать одну из функций и построить несколько хороших примеров кода, вот несколько идей:
Организационный корректор был использован пример, чтобы объяснить Python в Devdays Stackoverflow. A Реализация Scala может быть началом:
import util.matching.Regex.MatchIterator
val alphabet = 'a' to 'z' toArray
def train(features : MatchIterator) = (Map[String, Int]() /: features)((m, f) => m + ((f, m.getOrElse(f, 0) + 1)))
def words(text : String) = ("[%s]+" format alphabet.mkString).r.findAllIn(text.toLowerCase)
val dict = train(words(io.Source.fromFile("big.txt").mkString))
def edits(s : Seq[(String, String)]) = (for((a,b) <- s; if b.length > 0) yield a + b.substring(1)) ++
(for((a,b) <- s; if b.length > 1) yield a + b(1) + b(0) + b.substring(2)) ++
(for((a,b) <- s; c <- alphabet if b.length > 0) yield a + c + b.substring(1)) ++
(for((a,b) <- s; c <- alphabet) yield a + c + b)
def edits1(word : String) = edits(for(i <- 0 to word.length) yield (word take i, word drop i))
def edits2(word : String) = for(e1 <- edits1(word); e2 <-edits1(e1)) yield e2
def known(words : Seq[String]) = for(w <- words; found <- dict.get(w)) yield w
def or[T](candidates : Seq[T], other : => Seq[T]) = if(candidates.isEmpty) other else candidates
def candidates(word: String) = or(known(List(word)), or(known(edits1(word)), known(edits2(word))))
def correct(word : String) = ((-1, word) /: candidates(word))(
(max, word) => if(dict(word) > max._1) (dict(word), word) else max)._2
List("osters", "musters", "mixters") map correct foreach println
Это демонстрирует функции более высокого порядка, поддержку кортежного обслуживания, поддержка Regeex, вызов по имени, для выражений. OO Особенности (тип системы, черты, объекты, пакеты и видимость) отсутствуют. (Я нацелен на короткую реализацию.) Но вы можете добраться до внедрения ОО. Например, вы можете добавить некоторые черты, такие как словарь, корректор и т. Д.
Обычно существуют преобразования времени выполнения, так как битовые представления, как правило, не совместимы (за исключением того, что двоичные 0 обычно являются как 0, так и 0,0). Стандарты C и C++ имеют отношение только к значению, а не к представлению и определяют в целом разумное поведение. Помните, что большое значение int
обычно не может быть точно представлено в float
, а большое значение float
не может быть представлено как int
.
Поэтому:
Все преобразования по значению, а не по биту узоров. Не беспокойся о узорах.
Не беспокойтесь об энданнесе, так как это вопрос побитового представления.
Преобразование int
в float
может потерять точность, если целое значение является большим в абсолютном значении; он менее вероятен с двойным
, так как двойной
более точен и может представлять много более точных чисел. (Детали зависят от того, какие представления система фактически использует.)
Определения языка ничего не говорят о битовых узорах.
Преобразование float
в int
также является вопросом значений, а не бит узоров. Точная плавающая точка 2.0 будет преобразована в интеграл 2, потому что именно так настраивается реализация, а не из-за битовых узоров.
Предпочитаю следующее решение (требуется Джанго > = 1,0).
settings.py
INSTALLED_APPS+= ('django.contrib.flatpages',)
urls.py
urlpatterns+= patterns('django.contrib.flatpages.views',
url(r'^about-us/$', 'flatpage', {'url': '/about-us/'}, name='about'),
url(r'^license/$', 'flatpage', {'url': '/license/'}, name='license'),
)
[...]
<a href="{% url about %}"><span>{% trans "About us" %}</span></a>
<a href="{% url license %}"><span>{% trans "Licensing" %}</span></a>
[...]
from django.core.urlresolvers import reverse
[...]
reverse('license')
[...]
Это путь вам не нужно использовать django.contrib.flatpages.middleware.FlatpageFallbackMiddleware
, и реверс работает как обычно, не записывая столько кода, сколько в других решениях.
Ура.
-121--2178529-Я думаю, что вы слишком амбициозны в своем объеме. Просто показать людям новый и незнакомый синтаксис, скорее всего, немного «потеряет» их, поэтому добавление еще более резких изменений может быть шагом слишком далеко. Не забывайте: вы всегда можете сделать вторую презентацию, если первая популярна!
Я сделал это довольно много в моей компании некоторое время назад; это было только , когда я давал презентацию, что я вдруг понял, как странно и непонятно какой-то scala синтаксис появляется для аудитории (или, возможно, это был мой стиль доставки!). Я обнаружил, что следующее хорошо пошло вниз:
итеративный подход - возьмите один метод Java (не целая программа), а затем конвертируйте в действительно тупой подобно-для-типа Scala (объявления типов и все). Теперь примените один набор замещений scala (например, вывод типа), затем другой (например, псевдонимы типа), затем другой (например, закрытия) и т.д. Конечным результатом этого, вероятно, будет около трети кода Java, гораздо более читаемого и лаконичного, что можно противопоставить, поскольку люди теперь знакомы с происходящим. Удивительно, в какой степени Java - это просто перепутанная куча типов и ключевых слов, если смотреть в сравнении с чем-то вроде scala.
Найдите время, чтобы объяснить все стороны - например, пройти сопоставление шаблонов в некоторых деталях и как это работает. Не пропускайте экстракторы или случай x:: xs
. Я обнаружил, что люди действительно были заинтересованы в этом и что было так здорово в этом!
Функциональное программирование style занимает некоторое время. Неразумно заставлять людей сразу же это понимать. Я программировал в Скале больше года, и меня все еще смущают некоторые из них.
Использование REPL действительно здорово для некоторых низкоуровневых вещей, таких как показать, как все в scala (включая синхронизированные, try-catch
и т.д.) является выражением с типом.
Когда вы оправдываете удивительность вещей более низкого уровня, надеюсь, у вас будет аппетит людей к большему. (Я смотрел на реализации троичного оператора со знакомым коллегой буквально на прошлой неделе, и он счел это немного запутанным. Попытка представить целое приложение группе новичков - пути слишком много!)