【ahk】映射按键到执行函数

2023-11-08

global zFuncCallPattern := "^(\w+)\((.*)\)$"

IsFuncCallStr(callFuncStr) {
    Return RegExMatch(callFuncStr,"O)" zFuncCallPattern,matchObj)
}

EvalStrArgs(argsStr) {  ; we only can eval string expression
    args := []
    argStrArray := StrSplit(argsStr, "," , " `t")
    Return argStrArray
}

ParseFuncAndEval(funcCallStr) {
    ; startPattern jw
    ; FoundPos := RegExMatch(callFuncStr,"O)(^(?:Get|Do)[^(]*)\((.*)\)",matchObj)
    FoundPos := RegExMatch(funcCallStr,"O)" zFuncCallPattern,matchObj)
    If (!FoundPos) {
        Return -1
    }
    funcName := matchObj[1]
    args := EvalStrArgs(matchObj[2])
    ret := EvalFunc(funcName,args)
    If (ret == -1) {
        logstr = funcName %funcName% do not exists! funcCallStr=%funcCallStr%
    }
    Return ret
}

EvalFunc(funcName, arrParams) {
    If (!IsFunc(funcName)) {
        logstr = funcName %funcName% do not exists!
        Return -1
    }
    fn := Func(funcName)
    arrCount := arrParams.Count()
    If (arrCount < fn.MinParams Or arrCount > arrParams.Count()) {
        logstr = %arrCount% not correct for %funcName%!
        Return -1
    }
    Return DoEvalFunc(fn,arrParams)
}

DoEvalFunc(function, arr, params*) {
    len:=arr.length()
    IF (len) {
        ; arg := arr[len] ; arr.RemoveAt(len)
        arg := arr.Pop()
        ; remove arg asignment first . i.e func(arg1:="hello") => func("hello")
        arg := RegExReplace(arg,"^.*(:=|=)","") ; eval string

        ; try to remove str with double-quote. i.e. "hello" => hello
        arg := RegExReplace(arg,"^""(.*)""$","$1",replaceCount) ; eval string
        If (replaceCount) { 
            ; arg is simple plain string with double-quote i.e "test"
            ret := DoEvalFunc(function,arr,arg,params*)
        } Else If (arg="") {
            ; use default parameter. i.e func(,,)
            ret := DoEvalFunc(function,arr,,params*) 
        } Else If (RegExMatch(arg,"^[-+]?\d*\.?\d*$")) {
            ; arg is number(integer or float). i.e -123.456
            ret := DoEvalFunc(function,arr,arg+0,params*)  ; +0 for convert str to number
        } Else {   
            ; dereference var. func(varname)
            ret := DoEvalFunc(function,arr,%arg%,params*) ; Eval var
            ; varExist := VarSetCapacity(%arg%)
            ; If (!varExist) {
            If ( arg!= "Clipboard") {
                If (!IsSet(%arg%)) {
                    logstr = parameter var %arg% is not defined
                }
            }
        }
        Return ret
    } Else {
        Return function.Call(params*)
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ahk】映射按键到执行函数 的相关文章

随机推荐

  • va_list、va_start、va_arg、va_end宏的使用

    当你的函数的参数个数不确定时 就可以使用上述宏进行动态处理 这无疑为你的程序增加了灵活性 Example CString AppendString CString str1 一个连接字符串的函数 参数个数可以动态变化 LPCTSTR str
  • 特斯拉Model 3 Key Card里的黑科技

    特斯拉Model 3给用户提供了三种解锁电动车的姿势 遥控钥匙 可选 需付费购买 手机APP蓝牙解锁 以及 Key Card 钥匙卡片 其中Key Card作为手机蓝牙钥匙的备份方案 以应对手机没电了 忘带了 APP故障 车机蓝牙故障等上不
  • Python实现逻辑回归(LogisticRegression)完整过程

    最近正在做的项目正好利用到了逻辑回归 所以正好系统的学习了下 本篇博文把自己的学习笔记 项目思路及代码都记录下来 它的计算原理很多网站和书籍都有介绍 就不在这班门弄斧了 主要还是记录自己如何实现 一 逻辑回归简介 Logistic Regr
  • matlab中未定义与 ‘cell‘ 类型的输入参数相对应的运算符 ‘+‘ 的解决方案

    在函数文件中写入以下内容 function re fun a b varargin if nargin 2 re a b elseif nargin 3 c varargin 1 re a b c else error wrong end
  • 排序法 C语言常考的十大排序法 数列、字符的排序

    通过对近各大试卷题型分析 总结出 对于数据排序的十大方法 希望对大家有所帮助 方法一 冒泡排序法 升序排序法 方法二 选择排序法 方法三 插入排序法 方法四 希尔排序法 Shell Sort 方法五 归并排序法 方法六 快速排序法 交换排序
  • 一文搞懂Python时间序列预测(步骤,模板,python代码)

    预测包括 数值拟合 线性回归 多元回归 时间序列 神经网络等等 对于单变量的时间序列预测 模型有AR MA ARMA ARIMA 综合来说用ARIMA即可表示全部 数据和代码链接 数据和Jupyter文件 以预测美国未来10年GDP的变换情
  • PyTorch指定GPU训练 CUDA_VISIBLE_DEVICES

    方法一 import os import torch os environ CUDA VISIBLE DEVICES 4 5 方法二 CUDA VISIBLE DEVICES 4 python py
  • FPGA零基础学习之Vivado-LED流水灯实验

    FPGA零基础学习之Vivado LED流水灯实验 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发者
  • QT播放音频方法

    首先需要包含的头文件包含 include
  • opencv 07 用Hausdorff距离做形状匹配(shape_example) vs2015

    01 资源 OpenCV自带的行人检测demo opencv samples cpp shape example cpp shape example cpp可以图形形状相似对比 通过判断Hausdorff距离的结果做出最匹配判断 Hausd
  • Schedule

    Part1背景 定时任务 在我们实际开发中经常会用到 比如 Linux 的 Corntab Django 的 Django celery Django corntab 等 但是这些工具和框架总有某些不合适的地方 比如不灵活 笨重等 今天我们
  • 【算法】模拟退火

    文章目录 1 模拟退火介绍 1 1模拟退火的可行性 1 2退火模型 2 详解退火 2 1退火过程 2 2各变量说明 2 2 1关于接收概率 3 退火模拟求根号n的值 4 洛谷POJ 2420 1 模拟退火介绍 模拟退火是模拟物理上退火方法
  • ionic修改控件内置class样式

    背景 使用ionic中控件 有时候他的样式不能满足实际开发需求 需要改改一些样式 ion datetime 时间控件 想修改一下默认的白色背景 修改后 代码 在variables scss文件中的root伪类中增加属性 root 修改时间控
  • 正在设定sun-java6-jre解决方法

    今天搭建一个linux的开发环境遇到一个很无解的问题 出现一个 正在设定 sun java6 jre 的界面 然后鼠标接盘都操作不了 还是惊叹网络的强大 在网上搜索到一个解决方案 才发现遇到问题特别时一个很无解的问题 要即使的上网搜索一下
  • 计算机图形学 期末复习 微课版 孔令德 六、自由曲线与曲面 期末复习

    重点 公式 连续性条件 参数连续性 0阶参数连续性 若两个相邻的曲线段在首末点相连接 C 0 1阶参数连续性 若两个相邻曲线段在相交点处有相同的一阶导数 C 1 2阶参数连续性 若两个相邻曲线段的方程在相交点处具有相同的一阶和二阶导数 C
  • 基于CCG算法的IEEE33配电网两阶段鲁棒优化调度matlab

    目录 1 前言 2基本内容 2 1 配网两阶段鲁棒模型 2 2 求解步骤 3部分程序 4程序结果 5程序链接 1 前言 鲁棒优化是电力系统研究的热点 而两阶段鲁棒和分布鲁棒研究就成为各类期刊 sci ei 核心 的宠儿 最简单的思路是通过改
  • unity3D塔防游戏-虚拟现实大作业-包含源程序、导出exe文件,游戏设计报告

    unity3d塔防游戏 下载链接在文末 点我下载资源 https download csdn net download weixin 43474701 35073702
  • franchisor and franchisee

    What is the difference between a franchisor and a franchisee The franchisor is the person or corporation that owns the t
  • SpringCloud(四)注册中心之Eureka

    SpringCloud 四 注册中心之Eureka 第一代 Spring Cloud 核心组件 从形式上来说 Feign一个顶三 Feign RestTemplate Ribbon Hystrix 常用的服务注册中心 Eureka Naco
  • 【ahk】映射按键到执行函数

    global zFuncCallPattern w IsFuncCallStr callFuncStr Return RegExMatch callFuncStr O zFuncCallPattern matchObj EvalStrArg