kouzdra - January 26th, 2010
[Recent Entries][Archive][Friends][User Info]
02:53 pm
[Link] |
Теория стоимости В спорах про почку (ну да - обычная тема для флейма о стоимости человеческой жизни - как обычно, бессмысленного и беспощадного) упускается забавный момент:
Как известно стоимость вещи бывает трудовая и рыночная - рыночная стоимость донорской почки понятно весьма велика - потому как ресурс не просто дефицитный, но еще и не поддающийся целенаправленному производству - увеличение спроса не вызывает увеличение предложения.
А вот трудовая-то - это фактически просто стоимость операции - и вот то, что эта вилка народом не замечается - довольно забавно.
Хотя видимо весь сыр-бор в значительной степени обусловлен именно этой вилкой.
|
|
07:11 pm
[Link] |
Еще по поводу почечно-тюремной истории: Почему-то никому - ни гуманистам, ни либертарьянцам - по поводу этой ситуации (не факт что реальной, но не важно) - не пришла в голову одна простая мысль - что конкретного человека ув такой ситуации можно просто попросить уступить очередь (а каких там доводов только не приводилось). Не согласится - и ладно, но imho довольно велик шанс, что согласится.
Такое забавное наблюдение - все хотят измыслить универсальное правило.
|
|
08:04 pm
[Link] | X-Post: http://kouzdra.livejournal.com/328862.html X-Post: http://community.livejournal.com/ru_declarative/94261.html
Часть в общем вторая к этому вот:
http://kouzdra.livejournal.com/327847.html X-Posted: http://lj.rossia.org/users/kouzdra/813843.html X-Posted: http://community.livejournal.com/ru_declarative/94117.html
Итак: что на самом деле происходит в O'Caml при необходимости реализовывать частичное применение:
Там есть две группы встроенных функций caml_curryN и caml_applyN, которые преобразуют ар-ность функций: примерно в таком смысле (на примере n=3):
caml_curry_3 fn = fun a -> fun b -> fun c -> fn a b c Только, в отличие от того, что компилятор сгенерит для этого текста (а сгенерит он все ту же тернарную функцию, код для этих функций генерируется компилятором "вручную" при сборке исполняемого модуля и получается "список" ссылающихся друг на друга одноместных замыканий - в прямом соотвествии с текстом.
Про caml_applyN:
caml_apply_3 fn a b c = fn a b c А вот тут хитро: реально-то caml_apply_3 смотрит на указанное в замыкании число аргументов функции - если оно равно 3 - то он немедленно применяет fn к этим аргументам "напрямую" (адрес fn лежит в замыкании, создаваемом caml_curryN). Если же нет - то вызывает "поодиночке" столько замыканий, сколько надо - то есть "буквально" реализует синтаксис (((fn a) b) c).
То есть реальный код для примера из конца предыдущего поста
let compose = fun f -> fun g -> fun x -> f (g x)
let sp = compose succ pred Будет:
.long 3319
compose_closure:
.long caml_curry3
.long 7 -- 3 аргумента
.long compose
_main:
movl $camlMain, %ecx
movl $pred_closure, %ebx
movl $succ_closure, %eax
call caml_apply2
movl %eax, camlMain + 4 -- сохранение результата-замыкания
compose: -- повтор из предыдущего поста
subl $4, %esp
movl %eax, 0(%esp)
movl %ecx, %eax
movl (%ebx), %edx
call *%edx
movl 0(%esp), %ebx
movl (%ebx), %ecx
addl $4, %esp
jmp *%ecx
Вот в таком вот разрезе. Зачем это надо - точно сказать не возьмусь: гипотезы две - либо по результатам изысканий с профайлером там лучше, либо есть какие-то заморочки с полиморфизмом (весьма вероятно, кстати, восток полиморфизм - дело тонкое - там очень неожиданные вещи могут выплывать).
|
|
11:18 pm
[Link] |
"Семь футов английской земли или несколько больше..." А ведь этого же половина моих френдов не читала: ( Read more... ) Такие дела.
|
|