thedeemon: (office)
[personal profile] thedeemon
Фортран знаменит, по крайней мере для меня, тем, что там можно было изменить (в том числе случайно) значение числа 5 (или другой константы). Причем это не текстовая замена а-ля #define в Си, а изменение в рантайме, затрагивающее и независимый код. Сегодня я узнал, что эта замечательная возможность сохранилась в Джаве и Питоне.

Date: 2014-06-02 06:33 am (UTC)
From: [identity profile] yantayga.livejournal.com
Но зачем?

Date: 2014-06-02 06:57 am (UTC)
From: [identity profile] thedeemon.livejournal.com
В джаве - чтобы не боксить популярные маленькие константы каждый раз. В Питоне не уверен, но скорее всего что-то близкое, тоже кэшинг такой.

Date: 2014-06-02 09:02 am (UTC)
From: [identity profile] justy-tylor.livejournal.com
Там та же ситуация, чтобы лишний раз не боксить.

Date: 2014-06-02 05:10 pm (UTC)
ext_659502: (Default)
From: [identity profile] some41.livejournal.com
cpython глобально кеширует инты от -5 до 256 включительно, чтобы не создавать их много раз. еще кешируются все константы, используемые каждой функцией, так что для одной функции можно подменить значений любой константы. это, понятно, implementation detail.

Date: 2014-06-02 07:35 am (UTC)
From: [identity profile] kurilka.livejournal.com
Хацкель логичней :)
λ> let 2+2=5 in 2+2
5

Date: 2014-06-02 07:41 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Можно иначе, используя полиморфность плюса и числовых литералов:
> newtype Oh = Oh Integer deriving Eq
> instance Show Oh where show (Oh n) = show n
> instance Num Oh where {2 + 2 = 5; fromInteger n = Oh n}
> default (Oh)
> 2 + 2
5

Date: 2014-06-02 07:47 am (UTC)
From: [identity profile] kurilka.livejournal.com
Это слишком многословно - навевает скуку :)

Date: 2014-06-02 07:57 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Зато не мешает обычным плюсом пользоваться :)
> (2::Int) + (2::Int)
4

Date: 2014-06-02 08:28 am (UTC)
From: [identity profile] nealar.livejournal.com
> default (Oh)

это чит!

Date: 2014-06-02 08:55 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Не чит, а законный инструмент разрешения неоднозначностей при вычислении полиморфных выражений.

Date: 2014-06-02 08:23 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
god-like

Date: 2014-06-02 10:29 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Ага, только оно + ломает, 2+3 уже не вычисляется.

Date: 2014-06-02 09:01 am (UTC)
From: [identity profile] theiced.livejournal.com







class Fixnum
  alias_method :boring_plus, :+

  def +(o)
    d = self == 2 and o == 2 ? 1 : 0
    self.boring_plus(o).boring_plus(d)
  end
end

puts 2 + 2
Edited Date: 2014-06-02 09:03 am (UTC)

Date: 2014-06-02 10:27 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Там на Руби есть поинтереснее вариант. Просто + перееопределять слишком банально.

Date: 2014-06-02 10:11 am (UTC)
From: [identity profile] sassa-nf.livejournal.com
и только в Агде получится не только 2+2=5, но и 5-2=2 (и ещё много чего)

_+_ : N -> N -> N
z + n = succ n
(succ m) + n = succ(m + n)

Date: 2014-06-05 07:10 pm (UTC)
From: [identity profile] lelf.livejournal.com
> и только в Агде получится не только 2+2=5, но и

пфффф

2+2 : ℕ
2+2 = 5

Date: 2014-06-11 07:32 am (UTC)
From: [identity profile] migmit.livejournal.com
Я там не могу ответить, но
X = 5
% тут очень много кода
try
  % тут ещё до фига кода
  X = 2 + 2 % мегавычисление
catch
  _:_ -> ok % да хрена ли там падать
end,
io:format("2 + 2 = ~p~n", [X]).

Profile

thedeemon: (Default)
Dmitry Popov

February 2026

S M T W T F S
12 34567
891011121314
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 9th, 2026 07:51 am
Powered by Dreamwidth Studios