2 个版本
0.1.1 | 2021 年 6 月 5 日 |
---|---|
0.1.0 | 2021 年 6 月 5 日 |
#1407 在 命令行工具
每月 25 次下载
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 build
或 cargo run
。
然后您可以从目标文件夹中获取 plyg
或 plyg.exe
文件,然后从您的命令行界面使用它,而无需安装。
注意事项
-
目前在这个版本中,您不能混合编程语言。
每种语言都必须在其自己的块中。
正确
////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
}
- 具有除
//
之外其他注释的编程语言(如 python、perl、ruby、haskell 或其他)目前与该实用程序不兼容。
尽管它们可以使用,但用户在使用此程序后必须 手动
编辑文件,这违背了该实用程序的目的。用户只需运行此程序,指定所选语言的扩展名,生成的文件即可使用,无需手动编辑文件。
依赖项
~2.2–3MB
~53K SLoC