henry_flower (
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.

no subject
Тобто, коли маємо
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")
no subject
> copyFile "myDir" повертає функцію/1, яка має захардкодований destDir="myDir"
але тоді так виходить, що оригінальна "function copyFile destDir src = ( … )" сама собі вміє робити currying якщо її кóлати (як українською to call a func?) лише з 1 арг? це якась понтова фіча F#? (я, на жаль, F# не знаю.)
у мовах для простих смертних, треба спеціяльно писати хфункцію, яка робить отой currying!
тоді, наприклад, на JS я не бачу жодної практичної різниці у порядку агр, коли все робиться вручну.
якщо використовувати штуки типу http://ramdajs.com, де є хфунція auto currying, то для варіанту з "src, dest", вся різниці буде у додаванні 1 визову R.flip().
$ cat c.js let copy1 = function(dest, src) { console.log(`cp1 ${src} ${dest}`) // print in the Unix-style } let cp1 = function(dest) { // manual currying return src => copy1(dest, src) } ;['a1.txt', 'b1.txt'].map(cp1('dest/')) let copy2 = function(src, dest) { console.log(`cp2 ${src} ${dest}`) } let cp2 = function(dest) { // manual currying return src => copy2(src, dest) } ;['a2.txt', 'b2.txt'].map(cp2('dest/')) let R = require('ramda') // auto currying ;['a3.txt', 'b3.txt'].map(R.curry(copy1)('dest/')) ;['a4.txt', 'b4.txt'].map(R.curry(R.flip(copy2))('dest/')) $ node c.js cp1 a1.txt dest/ cp1 b1.txt dest/ cp2 a2.txt dest/ cp2 b2.txt dest/ cp1 a3.txt dest/ cp1 b3.txt dest/ cp2 a4.txt dest/ cp2 b4.txt dest/до речі, з lodash@4.17.5 зе хфінт вухами не працює, бо там зламано _.flip()
no subject
Вірно, будь-яку функцію f a b c можна викликати як f a, і результатом буде функція f2 b c
Але бувають і функції від групи аргументів. З точки зору функціонального програмування (не лише F#, а і всяких Ліспів, Хацкелів-цацкелів), f1(a,b,c) відрізняється від f2 a b c саме тим, що перша сприймає **ОДИН** аргумент, тип якого — tuple із кількох елементів — у даному випадку, (a,b,c). Якщо три елементи, то ще є синонім triple/quadruple ітд. І от той тупл розірвати ніззя, а значить, і функція від такого аргументу каррінгу не піддається.
Вірно, якщо тупл все одно створювати, то нема різниці в порядку елементів.
Ахаха, вірно, лише в одному крайньому випадку, коли аргументів саме два і не більше. :)
І дякую за наводку, Рамда виглядає гарно (мінус задовбучі дужки, але це не їхня провина, а синтаксис JS).
no subject
> І дякую за наводку, Рамда виглядає гарно
нема за що!
> (мінус задовбучі дужки, але це не їхня провина, а синтаксис JS).
"а галя ваша балувана", ггг
кому не до вподоби дужки, є кофіскрипт!
no subject
Основа мови — поцуплений OCaml, ага. :)
Але не вони одні. Автори того ж Хацкеля-цацкеля із 1999 року теж працюють на мєлкомягкіх.
З.І. Але ви мене не сприймайте як лютого функциональщика. Це я приблизно так читаю пана Ґанді, коли він про теорію груп пише: вродє, всі слова поокремо пойнятні, а разом — ніц не зрозуміло. :) А сам я більш орієнтований саме на девелопмент, а не на академічне підґрунтя.
Там, вродє, колись була епічна битва «spaces vs. Tabs», вже хтось переміг? :)) Чи, може, це в іншому проекті було, не памʼятаю точно…
no subject
CS компайлеру все одно.
імаксовський coffee-mode.el по замовчуванню юзає 2 spaces як 1цю індентейшн.
але то такє. після появи es6 кофіскрипт став непотрібен.
no subject
Я саме про це і кажу. Типовий layout:
два рядки:
* один починається з 6 spaces
* другий — з двох табів
при tab = 2 spaces перший рядок візуально глибше, ніж другий
при tab = 4 spaces (ненавиджу, але у більшості так) — другий рядок візуально глибше
У ФП воно у більшості випадків тупо не скомпілиться (навіть є приказка: «копілюється, значить, імовірно, працюватиме»)
А от в імперативній мові програмування — далеко не факт.