Initial commit
This commit is contained in:
12
.claude-plugin/plugin.json
Normal file
12
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "cpan-syntax-keyword-assert",
|
||||||
|
"description": "Assert keyword for Perl with zero runtime cost",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"author": {
|
||||||
|
"name": "kfly8",
|
||||||
|
"email": "kentafly88@gmail.com"
|
||||||
|
},
|
||||||
|
"skills": [
|
||||||
|
"./skills/"
|
||||||
|
]
|
||||||
|
}
|
||||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# cpan-syntax-keyword-assert
|
||||||
|
|
||||||
|
Assert keyword for Perl with zero runtime cost
|
||||||
45
plugin.lock.json
Normal file
45
plugin.lock.json
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||||
|
"pluginId": "gh:kfly8/claude-cpan-plugins:plugins/Syntax-Keyword-Assert",
|
||||||
|
"normalized": {
|
||||||
|
"repo": null,
|
||||||
|
"ref": "refs/tags/v20251128.0",
|
||||||
|
"commit": "209fc83ffd6a390f8992fc978084e7f80d78d34c",
|
||||||
|
"treeHash": "9fe6938088e8e965a810783bd438e8d58f6657afc912ee93078389720ac0573b",
|
||||||
|
"generatedAt": "2025-11-28T10:19:27.906760Z",
|
||||||
|
"toolVersion": "publish_plugins.py@0.2.0"
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||||
|
"branch": "master",
|
||||||
|
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||||
|
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||||
|
},
|
||||||
|
"manifest": {
|
||||||
|
"name": "cpan-syntax-keyword-assert",
|
||||||
|
"description": "Assert keyword for Perl with zero runtime cost",
|
||||||
|
"version": "1.0.0"
|
||||||
|
},
|
||||||
|
"content": {
|
||||||
|
"files": [
|
||||||
|
{
|
||||||
|
"path": "README.md",
|
||||||
|
"sha256": "4e758b7810ec91087f4247e56ef2106b8e504f860d7138a1b5be56d4e0ed4cc9"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": ".claude-plugin/plugin.json",
|
||||||
|
"sha256": "0fd8bd37258919d21fd26c4f3bac65a5e3271a780ab81ae674fd4cf149bef49f"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "skills/syntax-keyword-assert/SKILL.md",
|
||||||
|
"sha256": "df86eb48e1289b9b0ed60812a5e7ea95b4b3ecffbe0e2f8fe310798416672af5"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dirSha256": "9fe6938088e8e965a810783bd438e8d58f6657afc912ee93078389720ac0573b"
|
||||||
|
},
|
||||||
|
"security": {
|
||||||
|
"scannedAt": null,
|
||||||
|
"scannerVersion": null,
|
||||||
|
"flags": []
|
||||||
|
}
|
||||||
|
}
|
||||||
139
skills/syntax-keyword-assert/SKILL.md
Normal file
139
skills/syntax-keyword-assert/SKILL.md
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
---
|
||||||
|
name: syntax-keyword-assert-perl
|
||||||
|
description: Use Syntax::Keyword::Assert for zero-cost assertions in Perl
|
||||||
|
version: 1.0.0
|
||||||
|
author: kfly8
|
||||||
|
tags: [perl, cpan, assert, debugging, syntax-extension]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Syntax::Keyword::Assert - Zero-Cost Assertions
|
||||||
|
|
||||||
|
Syntax::Keyword::Assert provides an `assert` keyword for Perl with zero runtime cost when disabled.
|
||||||
|
|
||||||
|
## Core Function
|
||||||
|
|
||||||
|
### `assert EXPR`
|
||||||
|
```perl
|
||||||
|
use Syntax::Keyword::Assert;
|
||||||
|
|
||||||
|
assert $x > 0;
|
||||||
|
assert $obj isa "MyClass";
|
||||||
|
assert defined $value;
|
||||||
|
|
||||||
|
# Dies with "Assertion failed" if expression is false
|
||||||
|
assert "apple" eq "banana"; # Dies: Assertion failed
|
||||||
|
```
|
||||||
|
|
||||||
|
## Key Features
|
||||||
|
|
||||||
|
### Zero Runtime Cost
|
||||||
|
When assertions are disabled, they are completely removed at compile time:
|
||||||
|
```perl
|
||||||
|
# In production with assertions disabled:
|
||||||
|
assert expensive_check(); # This code is completely removed
|
||||||
|
```
|
||||||
|
|
||||||
|
### Environment Control
|
||||||
|
```perl
|
||||||
|
# Enable/disable assertions before module loading
|
||||||
|
$ENV{PERL_ASSERT_ENABLED} = 0; # Disable assertions
|
||||||
|
use Syntax::Keyword::Assert;
|
||||||
|
|
||||||
|
# Or keep default (enabled)
|
||||||
|
use Syntax::Keyword::Assert;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Practical Examples
|
||||||
|
|
||||||
|
### Input Validation
|
||||||
|
```perl
|
||||||
|
sub divide {
|
||||||
|
my ($a, $b) = @_;
|
||||||
|
|
||||||
|
assert defined $a && defined $b;
|
||||||
|
assert $b != 0;
|
||||||
|
|
||||||
|
return $a / $b;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Object Type Checking
|
||||||
|
```perl
|
||||||
|
sub process_user {
|
||||||
|
my $user = shift;
|
||||||
|
|
||||||
|
assert $user isa "User";
|
||||||
|
assert $user->can("get_name");
|
||||||
|
|
||||||
|
return $user->get_name();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Development Debugging
|
||||||
|
```perl
|
||||||
|
sub complex_algorithm {
|
||||||
|
my @data = @_;
|
||||||
|
|
||||||
|
assert @data > 0;
|
||||||
|
|
||||||
|
my $result = process_data(@data);
|
||||||
|
|
||||||
|
assert defined $result;
|
||||||
|
assert ref($result) eq 'HASH';
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Contract Programming
|
||||||
|
```perl
|
||||||
|
sub fibonacci {
|
||||||
|
my $n = shift;
|
||||||
|
|
||||||
|
# Precondition
|
||||||
|
assert $n >= 0;
|
||||||
|
|
||||||
|
my $result = $n <= 1 ? $n : fibonacci($n-1) + fibonacci($n-2);
|
||||||
|
|
||||||
|
# Postcondition
|
||||||
|
assert $result >= 0;
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Production Deployment
|
||||||
|
|
||||||
|
### Disable in Production
|
||||||
|
```perl
|
||||||
|
# In deployment script or environment setup
|
||||||
|
BEGIN {
|
||||||
|
$ENV{PERL_ASSERT_ENABLED} = 0 if $ENV{PRODUCTION};
|
||||||
|
}
|
||||||
|
|
||||||
|
use Syntax::Keyword::Assert;
|
||||||
|
# All assertions are now compile-time no-ops
|
||||||
|
```
|
||||||
|
|
||||||
|
### Conditional Assertions
|
||||||
|
```perl
|
||||||
|
# Development-only assertions
|
||||||
|
use Syntax::Keyword::Assert;
|
||||||
|
|
||||||
|
sub critical_function {
|
||||||
|
my $data = shift;
|
||||||
|
|
||||||
|
# This assertion disappears in production
|
||||||
|
assert validate_complex_invariant($data);
|
||||||
|
|
||||||
|
return process($data);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
1. **Use for debugging**: Add assertions during development, disable in production
|
||||||
|
2. **Check invariants**: Verify assumptions about data state and object types
|
||||||
|
3. **Validate inputs**: Assert preconditions for function parameters
|
||||||
|
4. **Document assumptions**: Assertions serve as executable documentation
|
||||||
|
5. **Zero-cost safety**: Enable aggressive checking without production performance penalty
|
||||||
Reference in New Issue
Block a user