henry_flower: A melancholy wolf (Default)
henry_flower ([personal profile] henry_flower) wrote2018-02-17 06:17 am

strcpy args

Аааа! Ох, який же я тупий! Всі ці роки я тихо бідкався про інконсістенсі у dest/src арг, не підозрюючи причину, чому dest часто 1й.

Останній ¶:

Date: Thu, 08 Feb 2018 19:09:34 -0500
From: Doug McIlroy <doug-bJGkzYaaMJvEkZP4S/TgZg@public.gmane.org>
Newsgroups: gmane.org.unix-heritage.general
Subject: Re: Device special files
User-Agent: Heirloom mailx 12.5 7/5/10
Message-ID: <201802090009.w1909YPC129547@tahoe.cs.Dartmouth.EDU>

> Why is it that umount(2) took the device special file name rather
> than the mount point directory name, anyway?

Symmetry. You unmount what you mount.

A competing model is that of links. Link makes an old file available
under a new name. But you unlink by the new name. Necessarily so,
because there may be many new names for one old file.

This is reminiscent of Don Norman's screed about the unnaturalness
of Unix. He didn't like strcpy because the arguments come in the
opposite order to those of cp. But stcpy is part of C, and in
C the destination of assignment comes before the source. But Norman
didn't rail at C. You pays your money and takes your choice.

Doug

Гадаю, з цієї самої причини Object.assign має 1м арг саме target.

bytebuster: (Deadline)

[personal profile] bytebuster 2018-02-17 12:52 pm (UTC)(link)
У функціональному програмуванні не те, щоб target був першим, але навпаки — source має бути останнім. Щоб нормально працював currying.
Тобто, коли маємо foo/2 target source
то тоді foo/2 target повертає fooNew/1 source
який, у свою чергу, можна чіпляти у ланцюжок операцій (синтаксис F#):

function copyFile destDir src = ( … )

[a.txt, b.txt, c.txt]
|> List.map (copyFile "myDir")


у цьому випадку copyFile "myDir" повертає функцію/1, яка має захардкодований destDir="myDir"

Якби source стояв не останнім:
function copyFileRev src destDir = ( … )

то довелося б руками створювати лямбда-функцію:
[a.txt, b.txt, c.txt]
|> List.map (func fileName -> copyFileRev fileName "myDir")
Edited 2018-02-17 13:03 (UTC)
bytebuster: (Deadline)

[personal profile] bytebuster 2018-02-18 08:37 am (UTC)(link)
сама собі вміє робити currying якщо її кóлати

Вірно, будь-яку функцію f a b c можна викликати як f a, і результатом буде функція f2 b c

Але бувають і функції від групи аргументів. З точки зору функціонального програмування (не лише F#, а і всяких Ліспів, Хацкелів-цацкелів), f1(a,b,c) відрізняється від f2 a b c саме тим, що перша сприймає **ОДИН** аргумент, тип якого — tuple із кількох елементів — у даному випадку, (a,b,c). Якщо три елементи, то ще є синонім triple/quadruple ітд. І от той тупл розірвати ніззя, а значить, і функція від такого аргументу каррінгу не піддається.

я не бачу жодної практичної різниці у порядку агр, коли все робиться вручну.

Вірно, якщо тупл все одно створювати, то нема різниці в порядку елементів.

вся різниці буде у додаванні 1 визову R.flip().

Ахаха, вірно, лише в одному крайньому випадку, коли аргументів саме два і не більше. :)

І дякую за наводку, Рамда виглядає гарно (мінус задовбучі дужки, але це не їхня провина, а синтаксис JS).
bytebuster: (ITCrowd-Douglas)

[personal profile] bytebuster 2018-02-19 04:33 am (UTC)(link)
автори F# розігналися на майкрософтських харчах

Основа мови — поцуплений OCaml, ага. :)

Але не вони одні. Автори того ж Хацкеля-цацкеля із 1999 року теж працюють на мєлкомягкіх.

З.І. Але ви мене не сприймайте як лютого функциональщика. Це я приблизно так читаю пана Ґанді, коли він про теорію груп пише: вродє, всі слова поокремо пойнятні, а разом — ніц не зрозуміло. :) А сам я більш орієнтований саме на девелопмент, а не на академічне підґрунтя.

кому не до вподоби дужки, є кофіскрипт!

Там, вродє, колись була епічна битва «spaces vs. Tabs», вже хтось переміг? :)) Чи, може, це в іншому проекті було, не памʼятаю точно…
bytebuster: (ITCrowd-Douglas)

[personal profile] bytebuster 2018-02-19 02:31 pm (UTC)(link)
по замовчуванню юзає 2 spaces як 1цю індентейшн.

Я саме про це і кажу. Типовий layout:
два рядки:
* один починається з 6 spaces
* другий — з двох табів

при tab = 2 spaces перший рядок візуально глибше, ніж другий
при tab = 4 spaces (ненавиджу, але у більшості так) — другий рядок візуально глибше

У ФП воно у більшості випадків тупо не скомпілиться (навіть є приказка: «копілюється, значить, імовірно, працюватиме»)
А от в імперативній мові програмування — далеко не факт.