duangsuse::Echo
710 subscribers
4.23K photos
127 videos
583 files
6.44K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
https://guide.elm-lang.org/ 好像 #Haskell 的语法啊 🤔 case of 还有等号函数定义、layout……
import Browser
import Dom.Widgets exposing (div, Text, Button)
import Dom.Events exposing (onClick)

main = Browser.sandbox { init = 0, view = view, update = update }
update state message =
case msg of
"inc" -> state + 1
else -> state
view state =
div [
Text ["$state"]
Button ["inc", "inc"]
]


🤔没看几眼就开始默写了,不会
duangsuse::Echo
import Browser import Dom.Widgets exposing (div, Text, Button) import Dom.Events exposing (onClick) main = Browser.sandbox { init = 0, view = view, update = update } update state message = case msg of "inc" -> state + 1 else -> state view state…
好了,我懂了。

import Browser
import Html exposing (Dom, div, button)
import Html.Events exposing (onClick)

type Msg = Increment | Decrement

main = Browser.sandbox { init = 0, view = view, update = update }

view model =
div [], [
([div [text model] ])
(button [text "+1"] [onClick Increment]),
(button [text "-1"] [onClick Decrement])
]

update msg model =
case msg of
Increment -> model + 1
Decrement -> model - 1
我觉得这一遍应该可以去试水了 🤔
module Main exposing (..)

import Browser
import Html exposing (Html, div, text, button)
import Html.Events exposing (onClick)

type alias Model = Int
type Msg = Increase | Decrease

main = Browser.sandbox { init = 0, view = view, update = update }

view model =
div []
[
div [] [text (String.fromInt model)],
button [onClick Decrease] [text "-1"],
button [onClick Increase] [text "+1"]
]

update msg model =
case msg of
Increase -> model + 1
Decrease -> model - 1


好了,没想到是这种参数顺序…… 我还以为 f [a 1] [b "?"] 是 "keyword argument" 呢

https://elm-lang.org/examples/buttons
duangsuse::Echo
我觉得这一遍应该可以去试水了 🤔 module Main exposing (..) import Browser import Html exposing (Html, div, text, button) import Html.Events exposing (onClick) type alias Model = Int type Msg = Increase | Decrease main = Browser.sandbox { init = 0, view = view, update =…
其实刚才我觉得 view 定义里,div 的参数列表的 layout 文法很复杂,说明 Elm 的语法实现起来很困难,不能不预取字符就判断是否开启新 layout 深度 🤔
刚才我才发现,只要参数列表不加逗号就是利用 layout 了,不过那还是需要先知道参数个数才能不预取字符。
duangsuse::Echo
我觉得这一遍应该可以去试水了 🤔 module Main exposing (..) import Browser import Html exposing (Html, div, text, button) import Html.Events exposing (onClick) type alias Model = Int type Msg = Increase | Decrease main = Browser.sandbox { init = 0, view = view, update =…
我再来复写下 Random die (1-6) :

module Main exposing (..)
import Browser
import Html exposing (Html, text, button)
import Html.Events (onClick)
import Random

type alias Model = { dieFace: Int }
type Msg = Roll | NewFace Int

view : Model -> Html Msg
view model =
div []
[
text (String.formInt mode.dieFace),
button [onClick Roll] [text "Roll"]
]

update: Msg -> Model -> (Model, Cmd)
update msg model =
case Msg of
Roll -> (model, Cmd.none)
(NewFace x) -> (Model { dieFace = x }, Random.rand dieFace (1..6))

subscriptors = Sub.none
duangsuse::Echo
我再来复写下 Random die (1-6) : module Main exposing (..) import Browser import Html exposing (Html, text, button) import Html.Events (onClick) import Random type alias Model = { dieFace: Int } type Msg = Roll | NewFace Int view : Model -> Html Msg view model…
……等等,不就是个 Effect 嘛,我又会了

module Main exposing (..)
import Browser
import Html exposing (Html, div, h1, text, button)
import Html.Events exposing (onClick)
import Random

type alias Model { dieFace: Int }
type Msg = Roll | NewFace Int

view model =
div []
[
h1 [] [text (String.fromInt mode.dieFace)],
button [onClick Roll] [text "Roll"]
]
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Roll -> (model, Random.rand (1..6))
(NewFace x) -> (Model x, Cmd.none)

subscription = Sub.none
import Browser
import Html exposing (..)
import Html.Events exposing (onClick)
import Random

type alias Model = { dieFace: Int }
type Msg = Roll | NewFace Int

main = Browser.element { init = init, view = view, update = update, subscriptions = subscriptions }

init : () -> (Model, Cmd Msg)
init _ = (Model 0, Cmd.none)

view : Model -> Html Msg
view model =
div []
[
h1 [] [text (String.fromInt model.dieFace)],
button [onClick Roll] [text "Roll"]
]

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Roll -> (model, Random.generate NewFace (Random.int 1 6))
(NewFace x) -> (Model x, Cmd.none)

subscriptions : Model -> Sub Msg
subscriptions model = Sub.none
https://elm-lang.org/examples/cat-gifs
很有意思,所有的视图更新都是在 update 里完成的,Message 则同时负责把数据送至 update 函数
State 都是 immutable 的,这样虽然会造成一些复杂性,但总体来看对程序的简洁性和规范性有很大帮助
This media is not supported in your browser
VIEW IN TELEGRAM
原来 Haskell 真是可以 industrial 的……
extern crate azul;
use azul::{ prelude::*, widgets::{ label::Label, button::Button } };

struct DataModel {
counter: usize
}
impl Layout for DataModel {
fn layout(&self, _info: LayoutInfo<DataModel>) -> Dom<DataModel> {
let label = Label::new(format!("{}", self.state.counter)).dom();
let btn_inc = Button::with_label("+1").dom().with_callback(Callback(on_inc_clicked));
Dom::div().with_child(label).with_child(btn_inc);
}
fn on_inc_clicked(&self, info: CallbackInfo<DataModel>) -> UpdateScreen {
info.state.counter += 1
Redraw
}
}
fn main() {
let mut app = App::new(AppOpts::default(), css::native).unwrap();
let win_main = app.create_window("Counter", WindowOpts::default()).unwrap();
app.run(win_main).unwrap();
}
This media is not supported in your browser
VIEW IN TELEGRAM
又写错了一个分号,需要值的地方只有语句
感觉脑子里没有类型一样,难道不知道可以用 Self 吗? &self 引用了哪里来的 self.state.counter?
with_callback 也忘记加事件了
忘记 impl for 里不该写什么了
App 需要 data model 参数和 AppConfig、create_window 用的名字是 WindowCreateOptions,明白了吗?
(迫真自我批评中)
extern crate azul;
use azul::{ prelude::*, widgets::{ label::Label, button::Button } };

struct DataModel {
counter: usize,
}
impl Layout for DataModel {
fn layout(&self, _info: LayoutInfo<Self>) -> Dom<Self> {
let label = Label::new(format!("{}", self.counter)).dom();
let btn_inc = Button::with_label("+1").dom().with_callback(On::ButtonUp, Callback(on_inc_clicked));
Dom::div().with_child(label).with_child(btn_inc)
}
}
fn on_inc_clicked(event: CallbackInfo<DataModel>) -> UpdateScreen {
event.state.counter += 1
Redraw
}
fn main() {
let mut app = App::new(DataModel { counter: 0 }, AppConfig::default()).unwrap();
let win_main = app.create_window(WindowCreateOptions::default(), css::native()).unwrap();
app.run(win_main).unwrap();
}
This media is not supported in your browser
VIEW IN TELEGRAM
还是少写了个 data,event.state.data.counter,唉,我应该清楚 state 不止 user data 的,就是不动脑子分析。
with_callback 也是临时突然忘了,想起有 with_ 再试试 with_event, with_handler 后才推出的
最后的 fn main() 倒是写对了
Forwarded from Solidot
LLVM 10.0.0 发布

LLVM 编译器套装项目释出了 10.0.0 版本。LLVM 项目目前的发布计划为每半年发布一个大版本。10.0.0 版本的主要变化包括:Clang 支持 C++ Concepts;Clang 默认不再运行在一个独立进程上;支持 Windows 10 内置的安全特性 Control Flow Guard (CFG);支持更多处理器核心和特性,等等。更多可浏览 LLVMClang、Extra Clang Tools、lld 和 libc++ 的发布公告。Media

https://www.solidot.org/story?sid=63921
duangsuse::Echo
喜欢本频道的内容吗?
看起来不喜欢的人多一些,也罢,反正我不常弄些能吸引人的东西 😂
duangsuse::Echo
extern crate azul; use azul::{ prelude::*, widgets::{ label::Label, button::Button } }; struct DataModel { counter: usize } impl Layout for DataModel { fn layout(&self, _info: LayoutInfo<DataModel>) -> Dom<DataModel> { let label = Label::new(format!("{}"…
不知道会不会有人看我在线默写会觉得很尴尬,反正这种行为只是在我看到比较有意思的项目时会去默写一些 example
一般情况下还是不会出现的,我也会用这种方法帮助自己理解 一门语言/一种设计命名方式 的直觉

频道的空间相对有限,所以我不会让这类消息过于频繁的出现。