#编程语言 #单文件 #沙箱 #工具 #玩耍 #命令行工具 #命令行

程序 plyg

一个用于在单个文件中安全尝试不同编程语言的沙箱

2 个版本

0.1.1 2021 年 6 月 5 日
0.1.0 2021 年 6 月 5 日

#1407命令行工具

每月 25 次下载

MIT 许可证

8KB
153

plyg

名称

plyg -- 一个用于在单个程序文件中安全尝试不同编程语言的工具。

概要

./plyg [extension_of_new_file] [file_to_use]
	
OR 

plyg [extension_of_new_file] [file_to_use]

描述

plyg - 由 playground 缩写而来,是一个使用单个文件尝试不同编程语言的工具。

当学习/使用多种编程语言时,您可能想用另一种语言测试/检查您在本语言中学到的某些概念。您不需要为这个目的创建不同的文件。

就像沙箱一样,在同一个文件中,通过在如下格式的代码块中声明您选择的语言来测试/检查这些概念 ////start <选择的语言扩展> 例如 ////start js////start go////start rs

该文件可以以 任何 编程语言扩展开始。参见 Examples 下的示例。

请注意,启动任何语言代码块的字符串之间没有 空格,并且与四个斜杠和单词 start 之间没有空格。之后跟着一个空格,然后是使用语言的扩展。

然后您可以写出您想要的语言的语法。要开始另一种语言,只需使用相同的代码块 ////start <lang ext>

在此文件中使用的每种编程语言,都必须以 ////start <选择的语言扩展> 的方式开始

////start c
#include <...>
#include <...>

int main() {
	...
}

////start js

console.log("You are getting it...")
...

在命令行上指定的每个语言扩展,必须 在文件中有相应的代码块。如果您指定了一个不在文件中的扩展名,则不会创建新文件。您将被告知该语言不在文件中。

您应该能够检查单个文件中的几种语言概念,而不需要为不同编程语言中的相同概念创建多个文件。

示例

假设您有一个名为 practice.go 的文件,包含以下内容

////start go
package main

import "fmt"

func main() {
	fmt.Println("hello world")
}

////start js
console.log("Hello, World, ja...");

////start java
import static java.lang.System.out;

class Hello {
    public static void main(String[] args) {
		    out.println("Hello, World Java...");
		}
}

////start rs
fn main() {
    println!("Hello, World of Rusty...");
}

////start c
#include <stdio.h>
#include <stdlib.h>
int main()
{
   char ch, file_name[25];
   FILE *fp;

   printf("Enter name of a file you wish to see\n");
   gets(file_name);

   fp = fopen(file_name, "r"); // read mode

   if (fp == NULL)
   {
      perror("Error while opening the file.\n");
      exit(EXIT_FAILURE);
   }

   printf("The contents of %s file are:\n", file_name);

   while((ch = fgetc(fp)) != EOF)
      printf("%c", ch);

   fclose(fp);
   return 0;
}

如果您想在同一个文件中尝试 C 程序

您可以这样做:从命令行界面(CLI)执行以下命令:./plyg c practice.go

您将看到一个输出,表明您现在有一个新文件,名为:practice.c。文件看起来是这样的

////start c
#include <stdio.h>
#include <stdlib.h>
int main()
{
   char ch, file_name[25];
   FILE *fp;
////
   printf("Enter name of a file you wish to see\n");
   gets(file_name);
////
   fp = fopen(file_name, "r"); // read mode
////
   if (fp == NULL)
   {
      perror("Error while opening the file.\n");
      exit(EXIT_FAILURE);
   }
////
   printf("The contents of %s file are:\n", file_name);
////
   while ((ch = fgetc(fp)) != EOF)
      printf("%c", ch);
////
   fclose(fp);
   return 0;
}
////start rs
////fn
////main()
////{
////   println !("Hello, World of Rusty...");
////}
////
////start java
////import static java.lang.System.out;
////
////class Hello
////{
////public
////   static void main(String[] args)
////   {
////      out.println("Hello, World Java...");
////   }
////}
////
////start go
////package main
////
////    import "fmt"
////
////    func
////    main(){
////        fmt.Println("hello world")}
////
////start js
////console.log("Hello, World, ja...");
////

您可以使用您选择的任何编译器编译您的 C 文件,然后运行以获得您想要的结果。

注意,练习文件中的 C 程序被移到了文件顶部,其他语言的语法以注释形式存在。

安装和用法

如果您已经在您的系统上安装了 cargo;只需这样做

cargo安装 plyg

然而,如果您从 GitHub 链接下载,您可能需要使用以下命令进行编译:cargo buildcargo run

然后您可以从目标文件夹中获取 plygplyg.exe 文件,然后从您的命令行界面使用它,而无需安装。

注意事项

  1. 目前在这个版本中,您不能混合编程语言。

    每种语言都必须在其自己的块中。

    正确


////start js
"use strict";

const fac = (num) => {
    if (num <= 1) {
        return 1;
    } else {
        return num * fac(num-1);
    }
};

[...Array(10).keys()].map((n) => fac(n)).forEach((n) => console.log(n));

////start go
package main

import "fmt"

type SliceParam struct {
	start int
	stop int
	step int
}

func main() {
	for i, val := range newSlice(SliceParam{start: 0, stop: 10, step: 1}) {
		fmt.Println(i, " => ", fac(val))
	}
}

func fac(num int) (result int) {
	if num <= 1 {
		result = 1
	} else {
		result = num * fac(num-1)
	}
		return result
}

func newSlice(arg SliceParam) (arr []int) {
	if arg.stop < arg.start {
		arg.start, arg.stop = arg.stop, arg.start
	}
	arr = make([]int, 0, arg.stop - arg.start)
	for i := arg.start; i < arg.stop; i += arg.step {
		arr = append(arr, i)
	}
	return
}

错误


////start js
"use strict";

const fac = (num) => {
	if (num <= 1) {
		return 1;
	} else {
		return num \* fac(num-1);
	}
};

////start go
package main

import "fmt"

type SliceParam struct {
	start int
	stop int
	step int
}

func main() {
	for i, val := range newSlice(SliceParam{start: 0, stop: 10, step: 1}) {
		fmt.Println(i, " => ", fac(val))
	}
}

////start js
[...Array(10).keys()].map((n) => fac(n)).forEach((n) => console.log(n));

////start go
func fac(num int) (result int) {
	if num <= 1 {
		result = 1
	} else {
		result = num \* fac(num-1)
	}
	return result
}

func newSlice(arg SliceParam) (arr []int) {
	if arg.stop < arg.start {
		arg.start, arg.stop = arg.stop, arg.start
	}
	arr = make([]int, 0, arg.stop - arg.start)
	for i := arg.start; i < arg.stop; i += arg.step {
		arr = append(arr, i)
	}
	return
}

  1. 具有除 // 之外其他注释的编程语言(如 python、perl、ruby、haskell 或其他)目前与该实用程序不兼容。

尽管它们可以使用,但用户在使用此程序后必须 手动 编辑文件,这违背了该实用程序的目的。用户只需运行此程序,指定所选语言的扩展名,生成的文件即可使用,无需手动编辑文件。

依赖项

~2.2–3MB
~53K SLoC