?

Log in

No account? Create an account
a_fixxer
SICP на Ruby 
4-фев-2008 11:24 pm
Собрался убивать двух зайцев одним махом.
1. Изучить функциональное программирование по книжке SICP. (Кто не знает, это фундаментальный курс программирования в MIT Structure and Interpretation of Computer Programs)
2. Изучить какой-нибудь динамический мультипарадигменный язычок для web. Колебался между ruby (ибо rails) и python (ибо django)

Итак буду читать sicp, а упражнение оттуда делать на ruby. (в sicp используется scheme)

Вобщем сначала ничего интересного, вводится префиксная запись, S-выражения и прочие особенности scheme, повторять которые на ruby никакого толку. А вот пункт 1.1.7 "Вычисление квадратного корня методом Ньютона" уже поинтереснее, причем мы ввели только арифметику, ветвление, сравнение и определение функции. Вот почти дословный перевод на ruby:

def average(x, y)
  (x + y) / 2
end

def good_enough(guess, x)
  ((guess ** 2 - x).abs < 0.001)
end

def improve(guess, x)
  average(guess, (x / guess))
end

def sqrt_iter(guess, x)
  if good_enough(guess, x)
    guess
  else
    sqrt_iter(improve(guess, x), x)
  end
end

def sqrt(x)
  sqrt_iter(1.0, x)
end

Итак рекурсия. А как еще сделаешь итерацию без циклов?
Нда, Ньютон, да не тот. Начальное приближение всегда 1.0 и проверка на завершение не блещет.
Ну да ладно не за то боремся, тем более авторы обещают потом исправиться. Посмотрим.

Что касаемо ruby, оказывается числовые константы это объекты с методами: -2.abs дает 2. А я пятнадцать минут функцию искал. Ну в общем даже прикольно. У чисел еще замечен такой забавный метод:

3.times do puts "обалдеть" end

обалдеть
обалдеть
обалдеть

так дело пойдет и никакие циклы не понадобятся.

Вобщем продолжение следует.

ЗЫ. Интересно а в ЖЖ есть подсветка синтаксиса? С разбега не нашел.
This page was loaded апр 22 2019, 12:56 am GMT.