首页 > 其他分享 >[AHK2] 配置文件新语法——函数

[AHK2] 配置文件新语法——函数

时间:2024-08-05 19:06:30浏览次数:9  
标签:__ http 配置文件 idx AHK2 语法 post def

开始

今天,我在使用自定义的配置文件语法时又发现了不足,那就是需要一种插值语法,可以减少很多重复。

比如,我有很多个字段都是http网址:

能不能不打这么多?答案是可以的,所以我设计了新语法————函数。

它类似ahk的api之Format,但是只有插值{}语法。

实现

在这里,我只给出它的一个demo,完成字符串的信息提取与动态的插值。

1. 语法

它的语法很简单,看下面的例子:

&fn(a, b) : http://{a}:{b}

vm : $fn(192.168.6.100, 8080)$

2. 解析

实际上,我们要关心的只有方法参数,与后面的方法体,即:

  • (a, b)
  • http://{a}:{b}

要做的是实现参数与方法体内变量位置的映射,比如上面的例子就是:

{
	1 : 1  ; 方法体内第一个变量对应第一个参数
	2 : 2  ; 同上
}
  • 先从参数开始,我们要提取出参数名和对应的顺序:
def := '(a, b)'
def := StrReplace(def, A_Space)
if def[1] != '(' or def[-1] != ')'
  MsgBox 'err'
def := def.substring(2, def.Length)
params := {}
StrSplit(def, ',').filter(v => v).foreach((v, i) => params[v] := i)

; MToString params
; => {a : 1, b : 2}
  • 然后是方法体,需要提取出变量位置与还原出去除变量后的字符串:

body := 'http://{b}:{a}'

_pos := 1, idx := {}, post := ''
for i, v in body {
  if v = '{' {
    _pos := i
  } else if v = '}' {
    idx[idx.Length + 1] := body.substring(_pos + 1, i)
    post := SubStr(post, 1, post.Length - i + _pos + 1)
  }
  post .= v
}

; MsgBox post
; => http://{}:{}
; MToString idx
; => { 1 : b, 2 : a}
  • 第三步,建立映射关系

for k, v in idx.OwnProps() {
  idx[k] := params[v]
}

; MToString idx
; => { 1 : 2, 2 : 1}
  • 第四步,实现动态插值

这一步需要对ahk的语法十分了解。

__f__ := (_p*) => __f.Bind(post, idx, _p*)

MsgBox __f__(1, 2)()

__f(str, mapping, p*) {
  i := 1, _chs := str.toChararray(), _r := '', _c := 1
  while i + 1 <= _chs.Length {
    if _chs[i] = '{' and _chs[i + 1] = '}' {
      _r .= p[mapping[_c]], _c++, i++
    } else _r .= _chs[i]
    i++
  }
  return _r
}

最后,打印的结果就是:http://2:1

对应到配置文件语法就是下面这样:

; vm : $fn(2, 1)$
a := 2, b := 1
MsgBox __f__(a, b)()

标签:__,http,配置文件,idx,AHK2,语法,post,def
From: https://www.cnblogs.com/refiz/p/18343870

相关文章

  • Java基础语法
    关键字和保留字在Java编程语言中,关键字和保留字是语言的基本组成部分。它们有特定的含义并在Java程序中扮演着重要的角色。理解这些关键字和保留字对于编写有效的Java代码至关重要。1.关键字(Keywords)关键字是Java语言中具有特殊含义的词,它们在编译器中被预定义并用于执行特定......
  • Oracle捕捉SQL语法错误的10035事件
    Oracle数据库中,有的时候新上的程序,会出现与数据库建立了会话,但是传输的SQL是错误的情况,这个时候,我们需要打开oracle10035事件。ALTERSYSTEMSETEVENTS'10035tracenamecontext forever,level1;打开后,在alert文件中,会出现所有解析失败的SQL.解析失败的原因总结......
  • JavaScript基础语法
    第一章JavaScript基础语法一、字面量(编程语言中的固定量)1.数字(Number)可以为整数,小数,科学计数(e)等等2.字符串(String)3.表达式用于计算的固定值。3+2.2,3.14*2等4.数组(Array)5.对象(Object)定义一个对象在JavaScript中,对象(Object)是一种复杂的数据类型,用于存储键值对(key-v......
  • 3.Java基础语法
    注释单行注释//单行注释//输入一个HelloWorld!多行注释:可以注释一段文字/*注释*///多行注释:可以注释一段文字/*注释*//*多行注释多行注释多行注释*/文档注释:JavaDoc/***@DescriptionHelloWorld*@Author爱吃麻辣烫的妹纸*/⭐️注意:书写......
  • vue filter 只能用于插值语法中吗,属性绑定可以用 filter 吗
    Vue过滤器不仅可以用于插值语法中,也可以用于属性绑定中。具体来说:插值语法中使用过滤器:过滤器可以用在双花括号插值中[1][5]。例如:{{message|capitalize}}属性绑定中使用过滤器:从Vue2.1.0版本开始,过滤器也可以用在v-bind表达式中[1][5]。例如:<divv-bi......
  • Shell编程 --基础语法(2)
    文章目录Shell基础语法运算符算术运算符关系运算符bool运算符逻辑运算符字符串运算符文件测试运算符read命令printf命令总结ShellShell编程Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;......
  • Java基础语法之控制流
    在上一篇文章中,我们介绍了Java基础语法之运算符和表达式(Java基础语法之运算符和表达式),在Java编程中,控制流结构决定了程序的执行顺序。通过使用不同的控制流语句,可以实现条件判断、循环执行和跳转操作。文章目录1.控制流结构类型条件语句循环语句跳转语句2.知识结构图......
  • 【C++核心篇】—— C++面向对象编程:封装相关语法使用和注意事项详解(全网最详细!!!)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、封装(类)1.封装的使用(类和对象)2.对象的初始化和清理2.1构造函数2.2析构函数2.3构造函数的分类及调用3.深拷贝与浅拷贝4.C++对象模型和this指针5.友元6.运算符重载前言在本篇......
  • Shell编程 --基础语法(1)
    文章目录Shell编程基础语法变量定义变量使用变量命令的使用只读变量删除变量传递参数字符串获取字符串长度字符串截取数组定义方式关联数组获取数组的长度总结Shell编程Shell是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和......
  • 3:python语法第二章:语法基础2(适合小白进行观看)
    目录:3.1条件控制语句3.1.1基本的if,else语句3.1.2if嵌套首先学习两个语句的话,最为重要的就是要搞清楚这个底层逻辑是啥,学会了底层的逻辑便很容易的写出代码。3.1条件控制语句3.1.1基本的if,else语句基本的if,else的代码,可以首先理解一些什么是if,在英文中if指的是如果,所以说......