sml

SML { ❄ }

第 11 章:实战翻译挑战

第 11 章:实战翻译挑战

光看会忘记,动手才记住。这一章不给标准答案——给你原始配置,要你手写等价的 SML,再点「验证」让解析器实时判分。

这些挑战刻意选了工程里常见的格式(Caddyfile / docker-compose / nginx),它们和 SML 的「块 + 键值」思维高度相通。翻译时记住三条:

  1. 块 = 块:name { } 两边通用;
  2. 键值对:key value(Caddy/nginx)或 key: value(YAML)都对应 SML 的 key: value
  3. 数组:SML 用 [ a b c ](逗号可省),YAML 用 [a, b, c]

下面是三个难度递增的挑战。每题右侧白底编辑器里直接写 SML,写错或漏字段都会即时提示。

挑战 1:Caddyfile → SML

🔧 挑战 1 · Caddyfile → SML ★★☆
下面是一段 Caddyfile。请用 SML 表达等价配置:把站点块变成嵌套块,把 key value 变成 key: value。完成后点「验证」,系统会检查关键字段是否都正确翻译。验证逻辑是 JS 直接解析你的 SML 并断言结果。
原始材料(待翻译)
example.com {
    reverse_proxy localhost:8080
    tls internal
    encode gzip
}
你的 SML 答案(可编辑)
💡 提示:Caddyfile 的 `example.com { }` 块 == SML 的 `example.com { }` 嵌套块;`tls internal` == `tls: internal`。

挑战 2:docker-compose → SML(高难度)

🔧 挑战 2 · docker-compose.yml → SML(高难度) ★★★
把下面 docker-compose 片段翻译成 SML。注意:YAML 的数组 [a, b] 在 SML 里写成 [ a b ];带连字符的键名(如 container_name)直接当裸词键即可。验证会检查 services.web 与 services.db 的关键字段。
原始材料(待翻译)
services:
  web:
    image: nginx:1.27
    ports:
      - "80:80"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
你的 SML 答案(可编辑)
💡 提示:SML 裸词里连字符 `-`、下划线 `_` 都是合法的键字符,所以 container_name / POSTGRES_PASSWORD 不用引号。

挑战 3:nginx.conf → SML(高难度)

🔧 挑战 3 · nginx.conf → SML(高难度) ★★★
把下面 nginx server 块翻译成 SML。nginx 的 listen 80; == SML listen: 80location / { } 是嵌套块;proxy_pass http://app; 是带空格的值,需要引号。验证检查 server 块的关键指令。
原始材料(待翻译)
server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://app:3000;
    }
    location /api {
        proxy_pass http://api:4000;
    }
}
你的 SML 答案(可编辑)
💡 提示:proxy_pass 的值含空格和冒号,必须加引号:`proxy_pass: "http://app:3000"`。但 `server_name example.com` 的 example.com 是裸词即可。

为什么这么做

把别的格式翻译成 SML,最能考验你有没有真正理解「SML 就是一棵树」。当你能凭直觉把任意配置映射成 块 / 键值 / 数组 三件套,你就已经掌握 SML 的精髓了。

附录:对照与排查