/tmp/duangsuse.sock
23 subscribers
303 photos
3 videos
92 files
337 links
从 duangsuse::Echo (@dsuse) 跟进出来的分支,将在作者恢复原帐号访问的时候合并删除。
Download Telegram
Forwarded from duangsuse::Echo (duangsuse /'dʊɔːŋ sjuːz/ | [⃪PLD, FPλ])
默写 DockerFile

FROM openjdk:8u181-jdk-alpine3.8 AS builder

ADD . /app
WORKDIR /app

RUN ./gradle shadowjar \\
&& cp server*.jar server.jar

FROM openjdk:8u181-jre-alpine3.8 AS runner
COPY --from builder /server.jar .
ENTRYPOINT ["java", "-jar", "server.jar"]

第二遍

FROM openjdk:8u181-jdk-alpine3.8 AS builder
ADD . /app/
WORKDIR /app/

RUN chmod +x gradlew \\ ./gradlew shadowJar \\
cp build/libs/server*.jar server.jar

FROM openjdk:8u181-jdk-alpine3.8 AS runner
WORKDIR /app/
COPY --from=builder server.jar .
ENTRYPOINT ["java", "-jar", "server.jar"]
.travis.yml

language: minimal
service:
- docker

install:
- VERSION=$(git rev-list --count HEAD)
- echo $DOCKER_PASSWORD | docker login $DOCKER_REGISTRY -u $DOCKER_USER --password-stdin
script:
- docker build -t "$DOCKER_REGISTRY/$DOCKER_IMGNAME:$VERSION" .
depoly:
- provider: script
script: docker push $DOCKRE_REGISTRY/$DOCKER_IMGNAME:$VERSION
on:
tags: true
/tmp/duangsuse.sock
.travis.yml language: minimal service: - docker install: - VERSION=$(git rev-list --count HEAD) - echo $DOCKER_PASSWORD | docker login $DOCKER_REGISTRY -u $DOCKER_USER --password-stdin script: - docker build -t "$DOCKER_REGISTRY/$DOCKER_IMGNAME:$VERSION"…
第二遍,我们需要 docker 的 build, depoly

language: minimal
service:
- docker

install:
- VERSION=$(git rev-list --count HEAD)
- VERSION_HEAD=$(git rev-parse --verify HEAD | head -c7)
- echo $DOCKER_PASS | docker login --password-stdin $DOCKER_REGISTRY -u $DOCKER_USER

script:
- PKGID="$DOCKER_REGISTRY/$DOCKER_IMGNAME:$VERSION"
- docker build -t $PKGID .

deploy:
- provider: script
script: docker push $PKGID
on:
tags: true
🤔 本来我没设计这个 1: 2: 的,看来要增加新模式匹配特性了...
那个 match 的语法没有新起一行,但是我感觉可以用(2D 文法)
我会给这些特殊的单 match 语句添加特别的文法规格的
Forwarded from dnaugsuz
就像这样:

//! StrictLanguage
def fizzBuzz(rng: Range = 1...100)
for n in rng match n
1: _ |*| 3 + 0 => cout << "Fizz " << n
2: _ |*| 5 + 0 => cout << "Buzz " << n
1: & 2: => print "FizzBuzz " << n
Forwarded from dnaugsuz
要是我的 GalScript 反向模式匹配真的可以写出来,就可以这么写了

match [*'®'.repeat(rc), *'©'.repeat(cc)] = "®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®©©©©©©©©©©©©©©©©©©©©©©©©"

println("(R): ", rc) println("(C):", cc)


不过这是不可能的,因为我还没打算支持方法调用参数的反向模式匹配...
Forwarded from dnaugsuz
目前只能反向模式匹配 self,不能反向参数,所以只能

match [*rc.timesStr('®'), *cc.timesStr('©')] = "®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®®©©©©©©©©©©©©©©©©©©©©©©©©"

而且也没有重复 repeat pattern,只有 ES6 的 expand operator
Forwarded from dnaugsuz
就像这样:

//! StrictLanguage
def fizzBuzz(rng: Range = 1...100)
for n in rng match n
1: _ |*| 3 + 0 => cout << "Fizz " << n
2: _ |*| 5 + 0 => cout << "Buzz " << n
1: & 2: => print "FizzBuzz " << n
Forwarded from dnaugsuz
我这周打算给 GeekApk 未来的脚本系统设计的一门多范式编程语言,支持编译到 Java/ES5/ES6 和利用 GalVM 虚拟机解释
Forwarded from dnaugsuz
而且这货还支持 implicit、cross inlined definition(不过 implicit 参数只能查找调用的一层作用域和 object instance )

语言总体主要是面向对象和函数式(此外也有点过程式和描述式的感觉),支持 rewrite 尾递归重写、渐进类型支持 type patterns(多态),此外它还支持反向模式匹配(match n+1 = 2 这种)
不太支持参数化类型(没有用户自定义的),但有函数类型、Map 类型什么的
Forwarded from dnaugsuz
实现的难点在学校里已经考虑过了,我觉得是时间问题

难点一方面在解析器上,它是 2D syntax,支持缩进语义所以非常灵活
一方面是在新的 reverse pattern matching 上面,我下了好大功夫设计,而且还很难实现(但是一些基础的 reverse pattern 不难实现)

譬如上面那个 match x + 1 = n 这个,n=1
此时解释实现需构造一个 MixPattern 对象 MixPattern(+1, Unknown("x")) 就可以了,它接受一个输入,然后把输入 -1 交给 Unknown("x") 匹配,就可以得到一个副作用,执行完就有了未知数 x 的值

另外一个实现问题就是 reverse method call pattern 可以从参数和返回值推导回 self,可是 self 的类型是什么?如果把实现调用接口的类型一个一个排除就太 inefficient 了

这就必须使用 1. 显示类型标记声明了但是没有定义的变量 2. is pattern,这个 pattern 断言了未知数一定是某个类型,就可以确定反向计算的接受者(receiver) 类型了(从而可以拿到对应 match 方法的实现进行反向计算)

match s.repace("aaa", "bbb") = "xbbb"
// Inefficient
match (s is Str).repace("aaa", "bbb") = "xbbb"
// OK

val s: Str
match s.repace("aaa", "bbb") = "xbbb"
// OK

可是这就意味着 reverse pattern matching 的某些组合需要参考它子项目的属性,而且必须是有传递性的(因为不能保证永远是 (s is Str), (s is Str + 'a') 也是一样...)
这个我还没想好....

目前需要这个功能的好像还只有 reverse method call pattern 一个,我觉得大概可以在解析类型推导的时候解决

GalScript 里有函数和方法的区分,但是目前不打算支持函数的反向模式匹配... 因为函数没有隐式的 self 参数,就必须可以这么干了

let add(x, 1) = 2
let sub(x, -2) = 1

可是这很麻烦(特别是对应的 match operator fn 实现起来... 它得知道啥是未知啥是已知。我有办法(implicit & match fn)可是我觉得很鸡肋 ),而且 GalScript 又不是确切的逻辑式语言,支持部分反向计算本意是作为 Pattern matching 的扩充,这样的话对 GalScript 不好

... 算了,我还是不支持 first-class pattern 的 custom match operator,然后支持 implicit 参数的 match operator fn 的推导算了...
就像这样:

class Str kind [char]
match operator fn repeat where
(implicit self, n: Nat)(it: Str) { self = it.take(n)[0..findSeqLength] } // 注意这不是 scala 的 currying 表示,()() 只是分割不同类型参数的语法糖....
(self, implicit n: Nat)(it: Str) { n = it.substrTakeWhile(self::startsWith).size }
fn findSeqLength(implicit it: Str) {...}
GalScript 的 cross 和 implicit、prefix operators、decorators 可以编写 async/await 关键字

%async def co jsonRpc(ctx, cont, url)
val resp = await http.GET(url)
if match resp is Error => fail
val json = await json.parse(resp.body)
if match json is Error => fail
away json

+ async 是什么?它是一个 decorator,就是高阶函数调用的简记法,它给内部的函数提供 coroutine context 和(传递下去,Thunk 函数的 callback)
+ def co 是什么?GalScript 有类似 ES6/Python 的 Generator 函数,它是自己包含状态可以挂起的状态机
+ ctx, cont 都可以拥有 implicit 的类型 def %async(...)(Fn ... -> ... -> ...) implicit x is Int, y is Int ....
+ await, away 是 prefix operator def,也可以拥有隐式的参数 implicit ctx: Cont, implicit cont: Fn
+ fail 该怎么实现(返回一个 error)?await 的 yield 该怎么办?有 cross inline,就可以办到了。所以他们都是 cross def

cross def fail(implicit Error as e) { return e }
dnaugsuz
实现的难点在学校里已经考虑过了,我觉得是时间问题 难点一方面在解析器上,它是 2D syntax,支持缩进语义所以非常灵活 一方面是在新的 reverse pattern matching 上面,我下了好大功夫设计,而且还很难实现(但是一些基础的 reverse pattern 不难实现) 譬如上面那个 match x + 1 = n 这个,n=1 此时解释实现需构造一个 MixPattern 对象 MixPattern(+1, Unknown("x")) 就可以了,它接受一个输入,然后把输入 -1 交给…
GalScript 还有一个特性,就是 Kotlin 也支持的 first-class delegates,它可以制造引用、惰性求值(虽然 GalScript 本身就支持)什么的

class Box(val x: Any)
operator as val = x
operator set val { x = it }

就可以把一个右值(rhs value) 变成一重引用左值(lhs value) 了,除了可以再次赋值外,和原来的东西无异

有意思的是 GalScript 的 set 关键字其实是用来定义 "enumeration" 的

set TrafficLight { RED, GREEN, BLUE }
本频道也对 editor duangsuse 的失败感到可惜(不过接下来

FROM openjdk:8u181-jdk-alpine3.8 AS builder
ADD . /app
WORKDIR /app
RUN chmod +x gradlew \\
&& ./gradlew shadowJar \\
&& mv build/libs/server-*.jar server.jar

FROM openjdk:8u181-jre-alpine3.8 AS runner
WORKDIR /app
COPY --from=builder /app/server.jar .
ENTRYPOINT ["java","-jar", "server.jar"]

//
language: minimal
service:
- docker
script: docker build -t $IMGID .
install: docker login $DOCKER_REGISTRY -u $DOCKER_USER <dockp --password-stdin
deploy:
- provider: script
script: docker push $IMGID
on: [tags: true]

before_install:
- REV=$(git rev-list --count HEAD)
- IMGID="$DOCKER_REGISTRY/$DOCKER_IMAGE:$REV"
- echo $DOCKER_PASS >dockp
Forwarded from duangsuse::Echo (duangsuse /'dʊɔːŋ sjuːz/ | [⃪PLD, FPλ])
很不幸的是,我最终因为拖延症没能完成,我决定剩下的时间,完成一点文字工作。祝好。
很荣幸能在看完《浮生物语 III(上)》之后,完善我的文字 (啊,我表达一点自己的理想还老是和 drakeet 过不去)
这简直是... 很无聊 但是我得做啊

真不是有意跟 drakeet 过不去,可是这些文字除了这里我不知该放哪了... 好方便啊,以后都加这里吧...
先讲一下自己的三观... 吧
Forwarded from Deleted Account
🌝 将此帐号踢出群聊并且屏蔽的 admin 请出来说明一下
如果贵群是自由法制的话,请在踢出前进行说明或者公示,禁言比直接删人+block 强。

如果不法制的话『民主』又怎么样呢?自由是什么?管理员无理由不通知设置屏蔽的自由?大陆就是最好的例子
希望贵群聊所说的自由不是带引号的自由,群规不是共产式法制的群规。

https://t.me/dsuset/6339

谢谢。